Где сохранить пакет?¶
Марат Сибгатулин aka eucariot.
“Где сохранить пакет” - книга о том, как устроена аппаратура для передачи данных в современных сетях - о чипах и о памяти. Доставка пакета от отправителя к получателю - это его последовательная передача от одного маршрутизатора к другому. Каждый узел должен самостоятельно принять решение, как поступить с этим пакетом.
Он должен также принять во внимание загрузку линии и не отправлять пакет, если он будет отброшен. А значит он должен его хранить, пока принимает решение и пока не освободится линия.
В этой книге мы поговорим про архитектуру сетевых устройств и чипов, из которых они собраны, о том, что происходит с пакетом с момента, как он попадает на входной интерфейс устройства и до момента, когда он его покидает.
Вторая половина (начиная с 5-й главы) будет посвящена архитектурам памяти и всевозможным ухищрениям, призванным выжать из сети максимальную полосу при минимальных задержках и потерях.
Книга является частью проекта linkmeup, где группа отчаянных энтузиастов пишет статьи и подкасты.
Есть два цикла статей:
- И несколько подкастов:
- telecom - подкасты про всё те же сети. Раз в месяц мы болтаем с каким-нибудь крутым экспертом на интересную нам тему. А 25-го числа выкладываем в самый всеобщий доступ.
В телеком выпуске у нас уже побывали: Mellanox Technologies, Microsoft, Arista, Cisco, Huawei, Элтекс, D-Link, Ericcson и ещё много кто, да не обидятся неупомянутые, ибо несть им числа.
sysadmins - ветвление по админо-девопсо-эсарйешно-эникейной линии.
В рамках эксперимента у нас работает бар “256-й TTL”:
Поссиелки - за виртуальной пинтой допрашиваем обладателей активных экспертных сертификатов (не только циско).По’уехавшие - истории эмигрантов и экспатов о том, где жить хорошо - а там, наверно, хорошо - ведь они там остались.Шоты - короткие интервью с разными людьми на узкие темы, например, перед или по следам доклада.По каким дням и в какие часы он работает - никто не знает. Заходите - вдруг вам повезёт и будет открыто.В 2018-м мы провели уникальную для нашей сферы сессию онлайн-собеседований в крупные компании.
И тогда же, допросив захваченного в плен HR, выяснили дела в тылу противника.
По любым вопросам можно писать на info@linkmeup.ru
Вы можете поддержать костёр энтузиазма подкинув угля через Патреон или другим удобным способом.
0. Введение¶
Самый мощный сетевой чип сегодня умеет обрабатывать 25 600 000 000 000 бит за одну секунду. 30 миллиардов транзисторов должны провернуть уйму работы, доставляя биты со входного интерфейса на выходной. Новые типы интерфейсов, увеличивающиеся скорости, утончающиеся техпроцессы, новые функции - бросают ежедневные вызовы инженерам, разработчикам, производителям. У меня давно уже был праздный интерес к аппаратной начинке сетевых коробок, а в этот раз я решил поковыряться отвёрткой ещё глубже и, сняв крышечку с сетевых микросхем, взглянуть на Pipeline’ы да SerDes’ы. Как вы уже, вероятно, поняли, в этой статье будет запредельно много сленга, англицизмов и слов на английском, потому что переводить их на русский неблагодарно, а порой и кощунственно.
Но знаете, какая мысль действительно не даёт мне покоя всю дорогу? Как вся эта сложнейшая конструкция: миллиарды транзисторов, размером около десятка нанометров, напечатанных на пластине размером с большую печеньку, которая полдюжиной тысяч ног припаяна к многослойной плате, напичканной мириадами других микрочипов, сопротивлений и конденсаторов и являющейся частью многоюнитовой модульной коробки, управляемой операционной системой, состоящей из сотен прошивок для разных чипов, инструкций по работе с ними, реализаций стандартизированных и проприетарных протоколов и механизмов поддержания жизнедеятельности многочисленных вентиляторов, блоков питания, линейных карт, фабрик коммутации, интерфейсов, процессоров, памяти - вообще хоть как-то работает, а тем более работает настолько стабильно в течение многих лет.
1. Терминология¶
Задача этого параграфа не объять все непонятные слова, употребляемые в статье, а лишь внести некую ясность в неразбериху русско-английских терминов.
Чип коммутации , сетевой процессор, (Packet) Forwarding Engine, PFE: микросхема, способная коммутировать пакет из входа в нужный выход с нужным набором заголовков. Pins, пины, ножки: металлические контакты на микросхеме для соединения с основанием. Data Path: путь внутри устройства (или чипа), по которому передвигается пользовательский трафик. Lookup, лукап, поиск: поиск адресата в таблицах (FIB, LFIB, ARP Adjacencies, IPv6 ND Table итд.) Pipeline или конвейер: набор действий, которые происходят с пакетом по мере его продвижения от входа в чип до выхода из него. Single-chip, одночиповый: устройство, внутри которого только один чип. Fixed, фиксированный, pizza-box: немодульный коммутатор. Обычно внутри него нет фабрик коммутации. Часто эти термины используются как синоним Single-chip, хотя это не совсем верно - внутри может стоять два (back-to-back) чипа или даже больше. SerDes, Сериализация/Десериализация: процесс перевода данных из параллельного низкоскоростного интерфейса (МГц) в последовательный высокоскоростной (ГГц) и наоборот. Например, из чипа в интерфейс или из чипа в фабрику. Память: физическая микросхема для хранения. Буфер: некий участок памяти, выделенный для хранения пакетов. Здесь и далее в производных словах, таких как “буферов”, ударение на “У”. Очередь: абстракция над буфером, позволяющая виртуально выстраивать пакеты в упорядоченную очередь. Фактически в памяти они, конечно, хранятся “как попало”. OCB - On-Chip Buffer: память, встроенная в чип. Programmable ASIC: ASIC, логику работы которого можно изменить путём перепрошивки. Programmable Pipeline: чип с возможностью для сторонних компаний программировать конкретные части ASIC в ограниченных пределах с помощью предоставляемого вендором компилятора. Packaging: упаковка кремниевого кристала в корпус для предотвращения механических повреждений и коррозии. Advanced Packaging: различные технологии, позволяющие внутри одного чипсета компоновать чипы различного вида и назначения. Например, совмещение ASIC и внешней памяти или ASIC и оптического трансивера. IP Core: Intellectual Property. Часть микросхемы, реализующая определённую функцию, например, SerDes. BUM: Broadcast, Unknown Unicast, Multicast.
2. Архитектура сетевых устройств¶
И отдельно от пути пакета - Control Plane Module, который отвечает за то, чтобы путь вообще появился. Это всяческие протоколы маршрутизации, обмена меток и прочее.
Это компоненты, которые присутствуют всегда и во всех сетевых устройствах.
Вообще об этом я уже писал, поэтому повторяться не буду. Точнее буду, но не сильно. Точнее сильно, но я добавлю здесь ещё смысла.
Один из вариантов реализации (single-chip устройство):
![]()
Single-chip устройство
![]()
Single-chip коммутатор Mellanox SN2700 на чипе Spectrum
![]()
Single-ship коммутатор на базе чипа Barefoot Tophino.
На этом этапе важно понять принципиальную разницу между плоскостями внутри устройства:
Уровни и плоскости¶
Это настолько важные вещи, что мы не можем не дать им определения.
В работе оборудования можно выделить три уровня/плоскости:
Forwarding/Data Plane
Control Plane
Management Plane
![]()
Forwarding/Data Plane¶
Примеры:
- Принять Ethernet-кадр, посчитать контрольную сумму, проверить есть ли SMAC в таблице MAC-адресов. Найти DMAC в таблице MAC-адресов, определить интерфейс, передать кадр.
- Принять MPLS-пакет, определить входной интерфейс и входную метку. Выполнить поиск в таблице меток, определить выходной интерфейс и выходную метку. Свопнуть. Передать.
- Пришёл поток пакетов. Выходным интерфейсом оказался LAG. Решение, в какие из интерфейсов их отправить, тоже принимается на Forwarding Plane.
Разница между Data и Forwarding Plane¶
Примерно так:
Control Plane¶
Примеры:
- Запустили сеть с IGP. Нужно сформировать Hello, согласовать параметры сессий, обменяться базами данных, просчитать кратчайшие маршруты, инсталлировать их в Таблицу Маршрутизации, поддерживать контакт через периодические Keepalive.
- Пришёл BGP Update. Control Plane добавляет новые маршруты в таблицу BGP, выбирает лучший, инсталлирует его в Таблицу Маршрутизации, при необходимости пересылает Update дальше.
- Администратор включил LDP. Для каждого префикса создаётся FEC, назначается метка, помещается в таблицу меток, анонсы уходят всем LDP-соседям.
- Собрали два коммутатора в стек. Выбрать главный, проиндексировать интерфейсы, актуализировать таблицы пересылок - задача Control Plane.
Работа и реализация Control Plane универсальна: ЦПУ + оперативная память: работает одинаково хоть на стоечных маршрутизаторах, хоть на виртуальных сетевых устройствах.
Management Plane¶
- Конфигурация устройства
- Температура
- Утилизация ресурсов
- Электропитание
- Скорость вращения вентиляторов
- Работоспособность плат и модулей.
- Примеры:
- Упал интерфейс - генерируется авария, лог и трап на систему мониторинга
- Поднялась температура чипа - увеличивает скорость вращения вентиляторов
- Обнаружил, что одна плата перестала отвечать на периодические запросы - выполняет рестарт плат - вдруг поднимется.
- Оператор подключился по SSH для снятия диагнонстической информации - CLI также обеспечивается Management Plane’ом.
- Приехала конфигурация по Netconf - Management Plane проверяет и применяет её. При необходимости инструктирует Control Plane о произошедших изменениях и необходимых действиях.
Вместе они составляют самодостаточный узел в сети пакетной коммутации.
И перед тем, как продолжить, взглянем на то, как выглядят модульные коробки:
Архитектура модульных устройств¶
В сетях датацентров долгое время правили огромные монстры размером со стойку - модульные коммутаторы с высокой плотностью портов. Сегодня они уступают место многоуровневым IP-фабрикам, собранным из одноюнитовых одночиповых коробок. Но такие шкафы никуда не уходят с роли бордеров и из сетей операторов. Поэтому мы разберём и их устройство. Тем более, что некоторые вещи будут актуальны и для коммутаторов попроще.
Для этой модели возьмём модульное шасси, состоящее из общей шины, интерфейсных и управляющих модулей и фабрики коммутации.
Общая шина¶
Общая шина (она же Back Plane, она же Midplane) устройства, связывающая друг с другом все модули. Обычно, это просто батарея медных контактов без каких-либо микросхем.
![]()
![]()
Так выглядит задняя часть платы, которая вставляется в шину
![]()
Так выглядит общая шина Juniper
![]()
Так выглядит общая шина Huawei
Вот эти две полоски посередине, набитые медными контактами - слоты для фабрик коммутации.
Управляющий модуль¶
Так выглядят управляющие платы разных устройств:
На всех фотографиях вы можете легко найти CPU, RAM и батарейку BIOS. На некоторых есть HDD, на других Compact Flash. Да, вы правы - это обычный ПК. Причём современные управляющие платы действительно имеют производительность на уровне компьютера 5-6 летнего возраста.
Интерфейсный модуль или линейная карта¶
Это модуль, который несёт на себе физические интерфейсы и FE (чип коммутации) и выполняет функции Forwarding Plane
![]()
![]()
Так выглядит линейная карта Cisco
Плата состоит из многих компонентов, которые могут быть реализованы как в одном чипе (System-on-Chip), так и на множестве отдельных в зависимости от класса устройства и архитектуры.
Основные части линейной карты:
- Собственно интерфейс
- PHY
- MAC
- FE - Forwardin Engine (Ingress/Egress)
- TM - Traffic Manager (QoS)
- Fabric Interface
Интерфейс¶
PHY¶
PHY занимается задачами физического уровня:
- Конвертация сигнала между средами (оптика-медь), если это нужно
- Восстановление битов из сигналов и наоборот
- Коррекция ошибок
- Синхронизация
MAC¶
Модуль MAC выполняет задачи канального уровня - Ethernet. Чаще всего является частью чипа коммутации, но не всегда.
FE - Forwarding Engine¶
FE или чип коммутации реализует все функции, связанные с коммутацией и маршрутизацией:
- Запросы к CAM/TCAM
- Трансформация Soft Table в Hard Table
- Принятие решения о передаче пакета (ACL, полисинг)
- Коммутация/Маршрутизация
- Маркировка приоритетов
- Зеркалирование
- Обнаружение протокольных пакетов
- Обработка сигналов/пакетов от CPU.
Далее ВНИМАНИЕ! Это один из очень важных моментов!
Во-вторых, именно входной FE входной линейной карты определяет всю дальнейшую судьбу пакета в пределах узла:
с небольшой оговоркой, что выходной тракт всё-таки может ещё произвести репликацию пакета или зарезать его по ACL
QoS или TM - Traffic Manager¶
Задача TM - выделять очереди, следить за перегрузками и рапоряжаться трафиком таким образом, как того требует дизайн QoS и маркировка пакетов (Congestion Avoidance и Congestion Management). Он же занимается репликацией BUM-трафика.
Fabric Interface¶
Чип, который обеспечивает взаимодействие с фабрикой коммутации. Может быть как частью FE, так и самостоятельным. Зачастую трафик на фабрику отправляется не как есть, а разбивается на ячейки одинакого размера, чтобы максимально равномерно загрузить все существующие линии. Это, а также передача метаданных - задача данного чипа.
Фабрика коммутации¶
Если мы возьмём Hi-End маршрутизатор операторского класса, то обычно в нём может насчитываться до двух десятков интерфейсных плат, в каждой из которых установлен как минимум один чип коммутации FE. Каждый чип коммутации смотрит частью своих ног в сторону интерфейсов, а частью в сторону задней шины. И ног там предостаточно, потому что медная среда имеет свой предел по пропускной способности - нам не хватит одного-двух выходов.
Как связать друг с другом два чипа коммутации? Ну просто же:
Как связать друг с другом три чипа? Ну, наверное, как-то так?
Как связать 8?
Уверены? Ничего не смущает?
Входные и выходные не связаны друг с другом напрямую, транзитные также не имеют связи.
Очень подробно топологии Клоза и их применения в современных ДЦ я разбирал в статье Как построить Гугл. Или сети современных датацентров
То же происходит и на фабрике.
Неплохой метод борьбы с этим - попоточная балансировка - вычисляется хэш по кортежу значений (SMAC, DMAC, SIP, DIP, Protocol, SPort, DPort, MPLS-метка итд.) и все пакеты одного потока начинают передаваться одним путём.
Но это работает неидеально. Зачастую один очень жирный поток может нагрузить один линк в то время, как другие будут простаивать. И с этим можно смириться на сети оператора, но нельзя в пределах этого синего ящика.
Идея Чарльза Клоза, которая сначала была реализована на телефонных станциях, затем была заимствована в Ethernet-коммутаторы и далее маршрутизаторы, ныне нашла своё место в сетях ЦОДов, заменив собой классическую трёхуровневую модель.
Так выглядят фабрики коммутации
Часто фабрика совмещается с управляющим модулем в одном слоту для экономии пространства в шасси и оптимизации вентиляции.
Поскольку вся книга посвящена обработке и хранению пакетов, я сосредоточусь на PFE и TM, которые и могут вносить вариативные задержки в доставку.
3. Типов-Чипов¶
Чипов чудовищное многообразие и простого короткого ответа на вопрос, какой выбрать - нет. Речь и про типы, и про изготовителей, и про серии, и про характеристики. Ниже я попытаюсь разложить все эти штуки на составляющие детали.
А начнём с типов чипов.
Компромиссы: скорость, функциональность, гибкость, цена
В IT всё есть компромисс. Всегда приходится чем-то жертвовать во благо другого.
Вот классический цискин треугольник про компромиссы:
Вендоры всегда балансируют в периметре этого треугольника.
Кроме того при таком количестве портов, сегодня вступают в игру энергопотребление, место в стойке, тепловыделение и, конечно, цена.
Итак, на сегодняшний день существуют следующие типы чипов, которые могут быть использованы в качестве пакетных процессоров:
Чипы коммутации¶
CPU — Central Processing Unit¶
![]()
- Неограниченная гибкость
- Неограниченная функциональность
- Приемлемая цена
- Полный провал по производительности
Note
Впрочем, не без исключений: бывают, что и большие штуки коммутируют в CPU.
Программная маршрутизация на CPU¶
Но как бы производители программных решений ни продвигали идею, что “все можно сделать в софте”, однако скорости выше 500 Гбит/с пока что можно достигать только с помощью специализированных асиков.
И давайте ещё прикинем. Выдержка с сайта про VPP:
Tip
Recent testing of FD.io release 17.04 shows impressive gains in performance on Intel’s newest platform when switching and routing layer 2⁄3 traffic. With the prior generation Intel® Xeon® Processor E7-8890v3, FD.io testing showed aggregate forwarding rate of 480 Gbps (200 Mpps) for 4-Socket machine (using 4 of E7-8890v3 CPU configuration); however, the same FD.io tests run on two 2-Socket blades (e.g. a modern 2RU server) with the new Intel® Xeon® Platinum 8168 CPUs (using four of 8168 CPUs in two by two-socket configuration), within the same power budget, show increase of forwarding rate to 948 Gbps (400 Mpps) benefiting from the PCIe bandwidth increase of the new CPUs, and the overall decrease in cycles-per-packet due to CPU micro-architecture improvements.
Без обвязки. А ещё кушать электричества он будет как голодный шакал. Не самый дешёвый получится рутер. Зато гибкий.
ASIC — Application Specific Integrated Circuit¶
![]()
- Околонулевая гибкость
- Ограниченная функциональность
- Низкая цена
- Ультравысокая производительность
Область применения: почти любые коммутаторы и многие маршрутизаторы.
Note
Впрочем, не без исключений: Juniper в своей линейке маршрутизаторов MX многие годы использует ASIC Trio.Который, кстати, согласно книге об MX является на самом деле набором ASIC’ов:PFEs are made of several ASICs, which may be grouped into four categories:
- Routing ASICs: LU or XL Chips. LU stands for Lookup Unit and XL is a more powerful (X) version.
- Forwarding ASICs: MQ or XM Chips. MQ stands for Memory and Queuing, and XM is a more powerful (X) version.
- Enhanced Class of Service (CoS) ASICs: QX or XQ Chips. Again, XQ is a more powerful version.
- Interface Adaptation ASICs: IX (only on certain low-speed GE MICs) and XF (only on MPC3E)
FPGA — Field Programmable Gate Array¶
Русский термин - ПЛИС - Программируемая Логическая Интегральная Схема.
- Вполне удовлетворительная гибкость
- Вполне удовлетворительная функциональность
- Цена успешного полёта Апполона до Луны и обратно
- Отличная производительность
Однако за такую программируемость приходится дорого платить.
Область применения: POC или низкоскоростные решения для энтерпрайз-сегмента.
Note
Впрочем, не без исключений: собеседовался я как-то раз в контору, в которой модульную коробку для операторов собирали полностью на FPGA, включая фабрику.
У этого даже есть основания: задолго до появления Programmable ASIC’ов на FPGA можно было делать любую обработку пакетов. И даже через несколько лет после производства плисину легко перепрошить и получить поддержку новой функции.
Автору неизвестны вендоры, которые бы на ПЛИС сделали PFE на скорости более 100 Гбит/с, по всей видимости, потому что частная компания не обладает для этого достаточным капиталом.Однако, я слышал, что в процессе разработки ASIC возможен такой подход, когда сначала разрабатывается FPGA, программируется нужным образом, тестируется, а потом с неё делают слепок для производства ASIC. Но пруфов нет.
NP - Network Processor¶
![]()
- Отличная гибкость
- Отличная функциональность
- Цена весьма высокая
- Производительность весьма высокая
NP или NPU - Network Processor Unit.
Большим преимуществом является то, что писать программы для NP можно на С. Это значительно ускоряет процесс, кроме того, где-то можно переиспользовать код.
Область применения: маршрутизаторы агрегации и ядра.
Note
Впрочем, не без исключений: например Smart-NIC Netronome в начале своего пути использовал Intel IXP.
Programmable ASIC¶
![]()
- Приемлемая гибкость
- Ограниченная функциональность
- Низкая цена
- Ультравысокая производительность.
Далее взглянем на применение различных чипов коммутации в коммутаторах ДЦ:
Чипы для датацентровых коммутаторов¶
Чтобы упростить себе жизнь, я продолжу далее разговор только об ASIC’ах под датацентровые коммутаторы, не пытаясь обнять Джабба Хатта.
Сегодня конкуренцию ему пытаются составить Mellanox со своими собственными чипами Spectrum (ныне уже Nvidia), Innovium Teralynx, Barefoot Tophino (ныне Intel). Своим появлением эти компании раскачивают рынок и провоцируют среди вендоров тренд на переход от внутренних разработок к готовым чипам их производства.
Мы в конце книги взглянем на их модельные ряды, но пока давайте обсудим, чем же чипы характеризуются и могут отличаться друг от друга.
А для этого надо понять, какие они задачи решают.
В датацентровых сетях есть три основных типа устройств:
![]()
Spine: сравнительно простая железка, требующая самый минимум функций - её задача просто молотить трафик. Очень много и очень быстро. Зачастую это просто IP-маршрутизация. Но бывают и топологии, в которых Spine играет чуть более важную роль (VXLAN anycast gateway). Но обычная практика - держать конфигурацию спайнов максимально простой. Leaf: чуть более требователен к функциям. Может терминировать на себе VXLAN или другие оверлеи. Здесь могут реализовываться политики QoS и ACL. Зато не нужна такая большая пропускная способность, как для спайнов. Кроме того, в некоторых сценариях (VXLAN) leaf знает о сервисах за подключенными машинами (клиентских сетях, контейнерах), соответственно, ему нужно больше ресурсов FIB для хранения этой инфорации. Edge-leaf: это устройства границы сети ДЦ и здесь уже фантазия ограничивается только свободой мысли сетевых архитекторов - MPLS, RSVP-TE, Segment Routing, всевозможные VPN’ы. При этом наименее требовательны к производительности.
На каждом устройстве, соответственно, разные требования к возможностям чипов - как по пропускной способности, так и по набору функций и по количеству ресурсов для хранения чего-либо.
Всё более и более производительные чипы нужно выпускать уже примерно каждые полтора-два года.
![]()
Актуализированная мной картинка из видео PP.
Конкурирующие производители чипов идут ноздря в ноздрю - почти одновременно у всех (Broadcom, Mellanox, Innovium, Barefoot) выходят микросхемы с почти идентичными характеристиками, а вслед за ними и коммутаторы с ними.
Ещё одним компромиссным вопросом является размер буфера, но об этом мы поговорим попозже.
Для многих незаметно, но уже почти жизненно важно, начинает работать динамическая балансировка трафика: чип отслеживает потоки (flows) и дробит их на флоулеты (flowlets) - короткие куски трафика одного потока, разделённые между собой паузой в несколько миллисекунд. Эти флоулеты он может динамически распределять по разным путям (ECMP или членам LAG), чтобы обеспечить более равномерную балансировку. Особенно важно это для Elephant Flows, оккупирующих один интерфейс.
Пользователям всё чаще хочется иметь возможность управлять распределением буфера, ну а перераспределение ресурсов FIB - это уже функциональность, отсутствие которой будет вызывать вопросы.
В условиях датацентров ECMP и балансировка силами сети - это воздух, вендорам нужно обеспечить нужное количество как ECMP-групп, так и общее количество Next-hop’ов.
Посочувствуем же бедным вендорам и будем выбирать долларом.
И на микросхемы памяти:
Чипы памяти¶
Отдельно от микросхем логики (и вместе с тем с ними рядом), хочу посмотреть поближе на память.
У микросхем памяти широкое применение в сетевых устройствах.
Это не те таблицы, которыми пользуется чип коммутации - они слишком медленные, поэтому отдельная память устанавливается для хранения так называемых Hard Tables - таблиц для Forwardig Plane. Soft Tables из обычной памяти преобразются в Hard Tables.
Для быстрого поиска по таблицам (за константное время) были изобретены специальные виды памяти: CAM и TCAM.
Различного рода память нужна для буферизации пакетов на входе и на выходе из устройства, и для их хранения, пока обрабатываются заголовки. Это RAM, который может быть в формате GDDR-5/6, HMC, HBM/2.
Ниже мы взглянем на них чуть подробнее.
RAM - Random Access Memory¶
Классическая оперативная память - куда без неё?
Второй немаловажный компонент сетевого устройства, реализованный на RAM - это очереди: входные, выходные, интерфейсные. Пока пакет ожидает своего черёда на обработку, обрабатывается в чипе или ожидает своей отправки, он томится в RAM.
Эта память может быть на кристалле чипа коммутации, может быть под одной с ним крышкой, а может и просто находиться неподалёку на плате.
Типы этой памяти меняются в зависимости от задач: SDRAM, DDR, GDDR5, GDDR6, HMC, HBM.
![]()
У меня очевидная слабость к 3д-рендерам
К вопросу о RAM я ещё неоднократно вернусь ниже в секции “Packaging и Advanced Packaging” и вся глава “Память и буферы” посвящена этому.
CAM - Content-Addressable Memory¶
Note
Не путать данную RAM с RAM, содержащей Soft Tables, описанной выше - это разные компоненты, расположенные в разных местах.
![]()
Вот архитектура такой памяти:
Вот пример работы
- А это схема реализации:
Это чем-то похоже на пару ключ-замок. Только ключ с правильной геометрией может поставить штифты замка в правильные положения и провернуть цилиндр. Вот только у нас много копий одного ключа и много разных конфигураций замков. И мы вставляем их все одновременно и пытаемся провернуть, а нужное значение лежит за той дверью, замок которой ключ откроет.
Для гибкого использования CAM мы берём не непосредственно значения из полей заголовков, а вычисляем их хэш. Хэш-функция используется для следующих целей:
- Длина результата значительно меньше, чем у входных значений. Так пространство MAC-адресов длиной 48 бит можно отобразить в 16-ибитовое значение, тем самым в 2^32 раза уменьшив длину значений, которые нужно сравнивать, и соответственно, размер CAM. Основная идея хэш-функции в том, что результат её выполнения для одинаковых входных данных всегда будет одинаков (например, как остаток от деления одного числа на другое - это пример элементарной хэш функции).
- Результат её выполнения на всём пространстве входных значений - это ± плоскость - все значения равновероятны. Это важно для снижения вероятности конфликта хэшей, когда два значения дают одинаковый результат. Конфликт хэшей, кстати, весьма любопытная проблема, которая описана в парадоксе дней рождения. Рекомендую почитать Hardware Defined Networking Брайна Петерсена, где помимо всего прочего он описывает механизмы избежания конфликта хэшей.
- Независимо от длины исходных аргументов, результат будет всегда одной длины. То есть на вход можно подать сложное сочетание аргументов, например, DMAC+EtherType, и для хранения не потребуется выделять более сложную структуру памяти.
Именно хэш закодирован в сравнивающие элементы. Именно хэш искомого значения будет сравниваться с ними. По принципу CAM схож с хэш-таблицами в программировании, только реализованными на чипах.
В этот принцип отлично укладывается также MPLS-коммутация, почему MPLS и сватали в своё время на IP.
Например:
- Пришёл самый первый Ethernet-кадр на порт коммутатора.
- Коммутатор извлёк SMAC, вычислил его хэш.
- Данный хэш он записал в сравнивающие элементы CAM, номер интерфейса откуда пришёл кадр в RAM, а в саму ячейку CAM адрес ячейки в RAM.
- Выполнил рассылку изначального кадра во все порты.
- Повторил пп. 1-5 ….
- Заполнена вся таблица MAC-адресов.
- Приходит Ethernet-кадр. Коммутатор сначала проверяет, известен ли ему данный SMAC (сравнивает хэш адреса с записанными хэшами в CAM) и, если нет, сохраняет.
- Извлекает DMAC, считает его хэш.
- Данный хэш он прогоняет через все сравнивающие элементы CAM и находит единственное совпадение.
- Узнаёт номер порта, отправляет туда изначальный кадр.
Резюме:
- Ячейки CAM адресуются хэшами.
- Ячейки CAM содержат (обычно) адрес ячейки в обычной памяти (RAM), потому что хранить конечную информацию в CAM - дорого.
- Каждая ячейка CAM имеет на входе сравнивающий элемент, который сравнивает искомое значение с хэш-адресом. От этого размер и стоимость CAM значительно больше, чем RAM.
- Проверка совпадения происходит одновременно во всех записях, отчего CAM дюже греется, зато выдаёт результат за константное время.
- CAM+RAM хранят Hard Tables (аппаратные таблицы), к которым обращается чип коммутации.
TCAM - Ternary Content-Addressable Memory¶
CAM весьма неплохо подходит для поиска MAC-адресов, где результат всегда заведомо один. А что не так с IP
- Как это в принципе реализовать?
- Как из нескольких подходящих маршрутов выбрать лучший (с длиннейшей маской)?
![]()
0.0.0.0/0 10.10.10.8/29 10.10.0.0/16 10.8.0.0/13 Другие
Алгоритмический поиск¶
Прогресс, как говорится, не стоит на месте. Появляются новые алгоритмы, совершенствуются старые. Чипы становятся всё более производительными иногда даже более дешёвыми. TCAM - вещь элегантная, но экономически не очень выгодная. И как только первый вендор реализовал алгоритмический поиск и стал продавать своё оборудование дешевле конкурентов с TCAM, все начали делать так же.
Суть этого подхода в том, что вместо прожорливого до денег и электричества TCAM ставится отдельный ASIC, реализующий алгоритмический лукап IP-адреса (или чего-то ещё) и тот же RAM рядом.
TCAM всё ещё применяется в сетевом оборудовании для узкоспециалиазированных задач.
Подробнее послушать о алгоритмах этого класса и деревьях можно в подкасте с Кодом Безопасности.
4. Архитектура сетевых ASIC¶
Сначала мы взглянем на физиологию чипа - из каких компонентов он состоит. А далее разберёмся что с пакетом в этих компонентах происходит.
Физическое устройство¶
Итак, для успешной коммутации пакета нужны следующие блоки:
- Парсер заголовков (Parser)
- Лукап (Match): FIB/LFIB, Nexthop-группы, ARP Adjacencies, IPv6 ND Tables, ACL итд
- Блоки преобразований (Action)
- Блок управления памятью (TM/MMU)
- Сборщик пакета (Deparser)
- SerDes
- Память для буферизации пакетов
- Блок, реализующий MAC
- Чип PHY
- Физические порты/трансиверы
![]()
Крупными мазками: оптический или электрический сигнал попадает на порт (Rx), тот его передаёт на PHY. Модуль PHY реализует функции физического уровня и передаёт биты на входные пины PFE, где сигнал блоками SerDes преобразуется в удобоваримый для чипа вид. Блок MAC из потока битов восстанавливает Ethernet-кадр и передаёт его парсеру. Парсер отделяет необходимые ему заголовки и передаёт их на анализ следующему блоку Match/Action. Тот их исследует и применяет нужные действия - отправить на правильный порт, на CPU, энкапсулировать, дропнуть итд. Тело пакета всё это время хранилось в буферах, управляемых MMU, и теперь пришло время Traffic Manager’у проводить все обряды QoS. И потом процесс раскручивается в обратную сторону. Снова Match/Action. Потом собрать пакет с новыми заголовками (Deparser), преобразовать кадр в поток битов (MAC), сериализовать (SerDes), осуществить действия физического уровня (PHY) и передать через выходной порт (Tx) в среду.
В простейшем случае вообще почти все блоки являются частью одного монолитного кристалла кремния. То есть они - продукт одного процесса печати на вафле.
Отдельные, составляющие чип компоненты, реализующие законченный набор функций, называются IP-core (не тот, что ты мог подумать, сетевой инженер!). То есть SerDes, MAC, TM - это всё отдельные IP-core. Зачастую они производятся сторонними компаниями, специализирующимися конкретно на данных компонентах, а потом встраиваются в микросхему. Особенно это касается SerDes - сложнейшей детали, в которую вендоры сетевых чипов не готовы вкладывать силы R&D. Один из крупных производителей SerDes - Inphi.
Другой распространённый вариант: в одном чипе сочетать несколько разных кристаллов с интерконнектом между ними. Так, например, память HBM коммерческого производства выносится за пределы кристалла сетевого ASIC:
Под крышкой одного производительного чипа могут быть собраны несколько, так называемых, менее производительных чиплетов (chiplet), которые, объединённые в фабрику, дают бо́льшую пропускную способность:
Для некоторых решений рядовая практика - вообще все ресурсы выносить за пределы сетевого ASIC’а:
В случае Juniper, кстати, их Trio - это не один ASIC - это их набор, каждый из которого реализует свои функции.
Но как бы ни был устроен сам чип, ему нужно общаться с миром. И поэтому на животике у него есть несколько тысяч пинов:
Одни пины нужны для того, чтобы подключить к чипу интерфейсы. Другие - чтобы подключиться к внешней памяти (CAM/TCAM/RAM), если она есть. Третьи - к фабрике коммутации, если коробка модульная.
Два пина образуют дифференциальную пару для передачи данных в одном направлении. То есть две пары пинов нужны для полнодуплексной передачи.
Вот так оно потом выглядит в программах для проектирования (для случая на порядок более простой микросхемы):
Теперь пришло время разобраться с тем, что же такое загадочный SerDes. Нет, это не ножки на микросхеме.
SerDes¶
Если коротко - то это блоки (IP-core) сетевого ASIC’а, которые позволяют получить сигнал с пинов и, наоборот, передать его туда.
Теперь с этимологией. Аналогично “модему” и “кодеку”, ставшим уже такими родными в кириллическом написании, SerDes составлен из двух слов: Serializer-Deserializer. Так чего же он сериализует и десериализует?
Блоки SerDes всегда являются составными частями кристалла сетевого чипа.
Выглядит довольно сложным. Для чего же вообще устраивать эту сериальную вакханалию, а не сделать просто пинов по числу реальных линий в чипе?
Зачем?¶
Модуляция¶
Итого, учитывая современные реалии (NRZ), для того, чтобы запитать данными интерфейс 100Гб/с нужно подвести к нему 4 SerDes’а по 28Гб/с (или 16 дорожек). Отсюда и берётся “лейновость” 100Ж-портов: 4 лейна - это 4 канала по 28Гб/с.
И это то, что позволяет 1х100Ж порт разбить на 4х25Ж с помощью гидры.
В случае PAM4 для 100Ж нужно только 2 SerDes’а по 56Гб/с, то есть два лейна.
GearBox’ы¶
Сложности с переходом на новые методы модуляции заключаются в том, что устройства на разных сторонах должны использовать одинаковые, либо нужно ставить дополнительные конвертеры. То есть просто подключить сотками коммутатор с PAM4 к NRZ не получится.
Ну а потом от вещей мирских перейдём к тому, сколько кругов пакет проходит в чипе.
PHY¶
- Конвертация сигнала между средами (оптика-медь), если это нужно
- Восстановление битов из сигналов и наоборот
- Коррекция ошибок
- Синхронизация
- И другие задачи физического уровня.
Если хочется знать больше, и не пугают забористые тексты со страшными картинками: PHY Interface for PCI Express, SATA, USB 3.1, DisplayPort, and Converged IO Architectures.
Что действительно любопытно и достойно обсуждения - так это его расположение. Если порт медный - RJ45, то чип PHY - это ASIC, установленный на плате.
Если порт оптический, то в подавляющем большинстве случаев эти функции возьмёт на себя DSP PHY, встроенный в трансивер (та самая штука, называемая нами модулем и вставляемая в дырку в коммутаторе).
Однако тенденции последних лет - это Silicon Photonics.
В случае silicon photonics микросхема PHY переносится внутрь самого чипа коммутации. В кристалл “встраиваются” фотонные порты, позволяющие осуществлять коммуникации между чипами на скорости света через оптическую среду.
Идея не новая, и только ожидавшая своего времени, а именно, когда технологии достигнут нужного уровня зрелости. Проблема была в том, что материалы и процессы, используемые для производства фотонных чипов, были фундаментально несовместимы с процессом производства кремниевых чипов - CMOS.
Из возможных альтернативных решений: установка на плату отдельного чипа, преобразующего электрический сигнал в оптический, или его установка внутрь сетевого чипа, но не на сам кристалл (всё ещё требует конвертации среды).
Но эта технологическая плотина смыта упорными разработками в этом направлении, и в скором будущем микроэлектронику ждут большие изменения.
Весьма занимательная статья с историей вопроса и сегодняшними реалиями.
Note
Кстати, был у нас в гостях Compass EOS, которые разработали co-packaged optics ещё до того, как это стало модным. Но, увы, они настолько опередили своё время, что оказались в тот момент никому не нужны. И постигла их ужасающе печальная судьба быть купленным не то Ростелекомом, не то Роснано. Впрочем, возможно, история звучала совсем иначе :).
Note
И прямо во время написания этой статьи 5-го марта 2х20 Intel опубликовал в своём блоге новость о том, что они продемонстрировали первый свитч, в котором им удалось интегрировать свой интеловский silicon photonics в барефутовский Tofino2.
Напоследок хочется немного времени посвятить прям совсем кишочкам, скрытым под металлической крышкой.
Packaging и Advanced Packaging¶
Packaging (корпусирование) - это процесс упаковки кристалла в корпус, который защитит его от физических повреждений и коррозии.
Я честно предпринял попытку разобраться в этом вопросе, но уже на втором часе чтения стало понятно, что, если хоть немного глубже общих понятий погружаться, то это будет требовать ещё одной статьи такого же размера, чтобы не прослыть дилетантом.
Когда-то давно, внутри одной микросхемы на плате был один кристалл. Даже не так - когда-то давно в микросхеме было несколько полупроводниковых элементов.
Нужно две микросхемы - ставим их рядом, соединяем дорожками.
Нужно много-много микросхем - делаем большие платы или собираем платы в несколько слоёв.
Со временем транзисторы становились меньше, а микросхемы сложнее - внутри одного кристалла могли совмещаться несколько логических блоков - это были первые SoC - System On Chip - ЦПУ+Память+какие-нибудь специфические задачи. Но сильно много туда всё равно не засунешь.
Потом научились, нарезав вафли на отдельные кристаллы, каждый из них запаковывать в отдельный пластиковый пакет, ставить один на другой и корпусировать вместе. Толщина таких бутербродов получалась большой - заметно больше, чем толщина ядра.
Что сделало возможными семимиллиметровые телефоны - так это Wafer-Level Packaging (WLP) или ещё это называют Advanced Packaging - технологии, позволяющие на одной вафле делать несколько микросхем и связывать их друг с другом. Сюда относятся: 2D, 2.5D, 3D, Fan-Out, 2.1D итд.
Каждый отдельный чип называется чиплетом (chiplet). Отличаются технологии Advanced Packaging’а друг от друга расположением чиплетов (рядом или один на другом), наличием и отсутствием интерпозера, материалом интерпозера (кремний, стекло, органика), видом электрических связей между кристаллами (металлические дорожки или TSV) и массой других. Суть их всех в том, что такая более плотная компоновка позволяет уменьшить размер, увеличить количество шин передачи данных, а соответственно и пропускную способность, значительно сократить энергопотребление и тепловыделение, отказавшись от длинных металлических дорожек.
Зачем я вообще в это решил копнуть? Во-первых, теперь немного понятнее становится что такое co-packged optics из предыдущего параграфа - это чиплет, реализующий оптический интерфейс, упакованный по одной из этих схем внутрь чипсета с ASIC’ом. А, во-вторых, дальше я буду рассказывать о памяти и буферах. Также я скажу о том, что каждый коммутационный ASIC обладает небольшим объёмом встроенной памяти - On-Chip Buffer. Она является составной частью асика коммутации.
Однако в некоторых случаях в помощь к ней добавляют объёмную внешнюю память, в которой пакеты будут храниться, если они не помещаются во встроенную. И пока это была какая-нибудь GDDR5, вынесенная отдельно на печатной плате в виде самостоятельного чипа, всё было понятно.
![]()
Своего родного сетевого не нашлось, но вот тут карточка от Энвидии с вынесенными GDDR5.
Но сегодня, с появлением WLP, когда под одной крышкой собраны и логика и память, границы начинают размываться. Некоторые вендоры спекулируют тем, что внешняя память co-packaged с коммутационным ASIC’ом, и утверждают, что она On-Chip.
Так, например, выглядит 2.5D корпусирование, где один чиплет соединён с другим через кремниевый интерпозер:
2.5D - это развитие классического подхода 2D. Оно всё ещё требует дорогостоящего выхода за пределы чиплета и прохода по длинным металлическим дорожкам. И кроме того обладает сравнительно невысокой пропускной способностью, ограничивающей максимальную скорость, на которой может работать чип в условиях, близких к перегрузкам.
Другой вариант - это уже 3D WLP:
Вот “более настоящая” схема устройства чипа Broadcom Jericho2. Здесь несколько чиплетов памяти HBM стекированы один на другой по технологии 3D, а сам чип коммутации с этим блоком внешней памяти взаимодействует через интерпозер.
- А вот совсем уж настоящее фото чипсета Juniper ZX EXPRESS, совмещающего память и ASIC под одной крышкой:
HBM - High Bandwidth Memory - как раз и является High Bandwidth благодаря очень широким шинам взаимодействия между плотно скомпонованными чиплетами.
Расположенные друг над другом они соединены через TSV - Through-Silicon Via - это микроскопические проходные отверстия в кристаллах, залитые металлом (например, вольфрамом), которые позволяют чипам общаться друг с другом. Они значительно короче линий в интерпозере, что позволяет их сделать гораздо более эффективными.
HBM весьма уверенно пробивает себе дорогу сегодня в мир Deep-Buffer!!! коробок.
Кстати по такой же 3D-технологии корпусирования была создана память HMC - Hybrid Memory Cube. Это бутерброд из склееных друг с другом плашек DRAM, пронизанных TSV.
HMC - это коммерческая память производства Micron, от которой ныне отказались в пользу HBM и GDDR6.
Считать ли такую компоновку действительно On-Chip или нет - вопрос открытый, но складывается мнение, что в будущем необходимая от ASIC’а скорость коммутации будет расти всё равно быстрее, чем пропускная способность интерфейса до пусть даже лежащего плотно на ней чиплета HBM.
Дальнейшее чтиво:
Логическое устройство¶
Типичный сетевой ASIC представляет из себя конвейер, по которому пакет передаётся от входного интерфейса к выходному, а по пути с ним случаются приключения. Английский термин для этого - Pipeline.
Хотя с виду и не скажешь:
В самом общем виде Pipeline выглядит так:
Пакет проходит через все стадии как минимум один раз, но для реализации сложных действий, вроде дополнительной инкапсуляции (VXLAN), может отправиться повторно.
Parser¶
Сначала на вход попадает пакет с неизвестным набором заголовков. Парсер разбирает все заголовки, отделяя их от собственно данных. Если это L2-коммутатор, то его заинтересует только заголовки Ethernet и VLAN. Если это MPLS-коммутатор, он заглянет в MPLS заголовки. Для L3 соответственно IPv4 и IPv6. Если это VXLAN-терминатор, ему понадобится UDP и собственно заголовок VXLAN. Для целей ECMP и ACL, парсер заглянет в UDP/TCP.
Строго говоря, на какие заголовки и какие поля в них надо смотреть, определяет фантазия разработчика. Сколько заголовков забрать? Как правило парсер вынимает фиксированное для чипа значение байтов от пакета и разделывает уже их. И это значение является одним из ограничений чипа.
Почему парсинг заголовков задача нетривиальная рассказывается в совместном исследовании Стэнфорда и Майкрософта: Design Principles for Packet Parsers.
Pre-Ingress processing¶
Иногда логически выделяют этот блок, который совершает действия, не являющиеся ни парсингом, ни как таковым лукапом - он кладет пакет в нужный VRF, ставит внутренний Traffic Class итд.
Ingress Match-Action¶
Когда парсер, разобрался с чем он имеет дело, он передаёт заголовки дальше - в модули Match-Action. Здесь происходит lookup. Для L2 поищем MAC’и, для L3 - прошерстим FIB, для MPLS - просмотрим в LFIB. И здесь же принимается решение, что с пакетом делать дальше: доложить CPU, пропустить/дропнуть, побалансировать, в какой порт отправить, какие заголовки навесить, с каким приоритетом внутри чипа обработать, полисить ли/шейпить ли его итд.
Собственно действие записано в той же таблице, в которой происходит lookup.
Это если коротко. А если чуть подлиннее, то:
L2 short pipeline¶
Приходящий L2-пакет всегда ассоциируется с VLAN. Тег VLAN проверяется через VLAN Lookup Table. Если VLAN lookup успешен, просматриваются таблицы: VLAN STP, VLAN Port Bitmap, Port Filtering Mode (PFM). Если же тег неверный, то пакет сбрасывается (или нет). После пакет проходит стандартную обработку: запомнить SRC MAC, посмотреть в таблице DST MAC, - но при этом могут быть применены дополнительные флаги, например, отправить на CPU unknown sender.
L3 short pipeline¶
Если DST MAC является MAC’ом самого устройства, то процессинг передается в L3 модуль. Следующий шаг - Destination Lookup. Сначала используется L3 Table Lookup, в этой таблице как правило directly attached хосты. Если адрес найден, то выдается index в L3 Interface Table, в котором выходной порт, MAC, VLAN. Если же в L3 table не найден адрес, то делается LPM поиск (Longest Prefix Match). Результат такого поиска - index в L3 Table Lookup таблице, который должен использоваться для форвардинга. После удачного поиска, чип поменяет SA/DA/VID пакета (L2), посчитает FCS, поменяет TTL и IP checksum.
Traffic Manager + MMU¶
Может также называться Buffer Manager. В этом блоке происходят следующие операции:
- Постановка пакетов в очередь
- Их хранение (буферизация)
- Контроль перегрузок
- Диспетчеризация
- Репликация
Он состоит из двух частей - MMU и TM. Первый отвечает за управление памятью и буферами, второй - за QoS и мультикаст.
MMU - Memory Management Unit - компонент чипа, который управляет физической памятью. Одна из его функций аналогична MMU (блоку управления памятью) обычного компьютера - доступ приложений к физической памяти и её защита. Но список его обязанностей гораздо шире, поскольку заточен он на работу именно с пакетами. Он отслеживает как память распределяется между интерфейсами и насколько она занята в каждый момент времени, можно ли поместить пакет в буфер, если да, то в какой, как разбить его на более мелкие ячейки, ну и, конечно, как его оттуда забрать.
TM - Traffic Manager - решает более высокоуровневые задачи - выделение очередей, помещение в них трафика, диспетчеризация, шейпинг, полисинг, управление перегрузками. В общем, всё, что относится к QoS, а так же к мультикасту.
Note
С мультикастом история, право, интересная (как всегда). Репликацией мультикастовых пакетов занимается блок TM. В модульных устройствах это происходит в два этапа: сначала на входном чипе создаётся столько копий, сколько выходных чипов должны получить этот пакет, а затем на выходных чипах ещё столько копий, сколько портов на этой плате должны его получить. Делается это для того, чтобы лишними копиями не загружать фабрику.Любопытный момент с буферизацией и контролем перегрузок: входной чип должен учитывать занятость выходного порта, прежде, чем отправлять пакет, потому что именно входная плата управляет VOQ. Поскольку Traffic Manager оперирует не самими пакетами, а по сути информацией о них, то ему необязательно делать сразу копий по числу выходных портов, а достаточно записать об этом информацию в VOQ.
MMU - это не совсем часть TM - это, скорее, два взаимодействующих друг с другом блока.
Память и буферизация на сетевых устройствах - это настолько масштабная тема, что ей я посвятил отдельную статью, которая выйдет на nag.ru прямо следом за этой. В ней мы разберёмся с устройством и архитектурой памяти, видами и расположением буферов, арбитражем и поднимем самый горячий вопрос современности - что лучше: большие и маленькие буферы.
В разговорах о буферах связка TM+MMU - одни из важнейших блоков ASIC’а (или внешний чип), поэтому к ним мы ещё вернёмся позже.
Egress Match-Action¶
Далее над заголовками пакетов могут быть совершены дополнительные акты - например, выходной ACL, туннельные инкапсуляции, сбор статистики итд.
Deparser¶
К этому моменту на основе результатов обработки в блоках Match-Action сформирован список новых заголовков, и он может воссоединиться с телом пакета. Сам пакет теперь готов в последний путь внутри этого чипа, чтобы выйти через выходной интерфейс.
Кроме того, здесь может собираться дополнительная статистика о длине пакетов и сообщаться блоку TM и зеркалироваться исходящий трафик.
Вышеуказанные стадии могут быть выполнены в пределах одного чипа, а могут быть и разнесены на разные. Так, в случае single-chip-коробки - все они скомпонованы в один кусочек силикона, площадью с фотку на документы. На модульных коробках Parser и Ingress Match-Action - это входной чип коммутации, Egress Match-Action и Deparser - выходной, TM стоит отдельно между чипом коммутации и фабрикой, и может быть разделён на Ingress и Egress. Кроме того в модульных устройствах могут существовать ещё и отдельные чипы Fabric Interface, которые разбивают пакеты на ячейки одного размера и отправляют в фабрику.
Pipeline¶
Пайплайном называется весь процесс доставки пакета от парсера до депарсера. Что хорошо - можно делать несколько Match-Action подряд, например, отлукапив сначала Ethernet, потом IP, потом ещё и TCP для ECMP.
Что плохо - число этих действий строго ограничено - ASIC вещь достаточно детерминированная. Это ведёт к тому, что некоторые вещи становятся аппаратно невозможны. К примеру, на старых Trident’ах нельзя было сделать и VXLAN и IP lookup последовательно для одного пакета. Или в другой ситуации коробка у меня не могла снять метку, сделать рекурсивный IP-lookup и навесить две новые метки.
Однако у таких трудностей есть как минимум три решения:
- Второй чип. Тогда можно и разнести невозможные прежде операции на два этапа. И история знает такие решения.
- Рециркуляция. Многие чипы позволяют закольцевать выход чипа на вход и прогнать пакет дважды. Тогда на второй итерации ему можно задать уже другой набор Match-Action. Но за это придётся заплатить - удвоенной задержкой и уменьшенной полосой пропускания чипа. А ещё можно упереться и в пропускную способность самого рециркулятора.
- Купить другой чип… Другой коммутатор… Поменять работу…
Programmable Pipeline¶
В большинстве современных коммутаторов конвейер обработки пакетов запечён производителем в софт (если не в кремний) - он фиксирован и может быть изменён только вендором чипсета.
Attention
Не путать с Programmable ASIC. Программируемые микросхемы - уже давно реальность. Многие сетевые чипы - это ASIC с возможность программирования. Но эта возможность есть только у производителя микросхемы.Порграммируемый конвейер же - это возможность изменять логику работы чипа в определённых пределах, которую предоставляет производитель микросхемы покупателям.
Не так давно появился Barefoot Tofino, у которого полностью программируемый Pipeline - с ним можно задавать совершенно любые условия для парсера, поля для Match и действия для Action - хоть калькулятор пишите, или распределённое хранилище на кластере коммутаторов.
На сегодняшний день выпускать сетевую микросхему на рынок без возможности программирования Pipeline’а, становиться плохим тоном. Так, последние чипы Broadcom тоже уже программируемы.
Не то чтобы теперь каждый домовой оператор кинется переписывать себе пайплайны, нанимая студентов для разработки под P4 или NPL, но это возможность, которая позволяет вендорам железа и крупным потребителям вроде гугла быть гораздо более гибкими. Так, например, если в вашей сети все линки p2p, то зачем вам Ethernet? тратить на него такты ASIC’а ещё - просто выкидываем его.
Правда “можно всё запрограммировать” превращается в наших реалиях “придётся всё запрограммировать”. На сегодняшний день готовых конструктивных блоков, вроде парсинга Ethernet, IP, подсчёта статистики итд - не существует - всё с нуля. Если не использовать вендорские бинари, то весь Pipeline придётся написать самому. А если использовать, то ничего за пределами SDK не запрограммируешь.
Но на большинстве современных коммутаторов всё ещё фиксированный конвейер, который выглядит примерно так:
Дальнейшее чтиво:
- Cisco всё ещё делает классную документацию, а презентации с Cisco Live - кладезь технических сокровищ. Например, они рассказывают о бродкомовских чипах больше, чем сам Бродком (если, конечно, вы не подписали NDA кровью): Cisco Nexus 3000 Switch Architecture
- Вот у P4 есть неплохое описание конвейера и его программируемости: P4 Tutorial, Hot Chips 2017.
- Более фундаментальное и низкоуровневое описание RMT - Reconfigurable Match Tables, необходимых для возможности программирования: Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN.
5. Память и буферы¶
Ну вот мы и добрались до ниточки, с которой клубок начал распутываться.
В сетевых чипсетах есть встроенная память (OCB - On Chip Buffer) как раз для хранения тел. Её размер в силу физических ограничений очень мал (до 100Мб), но для большинства задач - это разумный компромисс.
![]()
Note
Бывают редкие исключения, где встроенная память имеет больший размер.Но всегда были и будут сценарии, в которых нужна память гораздо большего объёма, в этом случае прибегают к использованию внешней относительно чипа коммутации памяти. Такие устройства называются Deep Buffer.И о них и вообще о компромиссах мало-много памяти поговорим отдельно.
Управляет доступом к физической памяти MMU - Memory Management Unit. Он довольно похож на MMU в компьютерах (по сути является им). Программа обращается к указателю, чтобы извлечь данные из памяти, MMU транслирует это в реальный адрес ячейки и возвращает данные.
MMU занимается размещением пакетов в буферах, их извлечением или отбрасыванием. Он же контролирует разделение памяти на области (dedicated, shared, headroom, voq) и их загрузку.
За более верхнеуровневое управление очередями и перегрузками отвечает блок TM - Traffic Manager.
Есть два подхода к размещению тел в буферах: Store-and-Forward и Cut-Through.
Store-and-Forward vs Cut-Through¶
Такой режим используется для приложений, требующих ультра-коротких задержек.
Tip
К слову на сегодняшний день для коммутаторов 2-го уровня время обработки в пределах устройства порядка 200нс, 3-го - 250нс.Для коммутаторов 1-го уровня (фактически патч-панель) это время - около 5 нс.
Многие производители сегодня по умолчанию устанавливают режим Cut-Through, поскольку ошибки на Ethernet сегодня явление сравнительно нечастое, а приложение обычно само может обнаружить проблему и запросить переотправку (или не запрашивать, кстати).
Дальнейшее чтение:
- Весьма глубокий подкоп под режимы коммутации от циски: Cisco Nexus 5000 Series Switches
Перегрузки: причины и места¶
Причины перегрузок¶
И поэтому тут уже недостаточно везде FIFO. Это задача, во благо которой трудится QoS.
Но в каком месте располагать эту память и где реализовывать QoS?
Места возникновения перегрузок¶
Их по большому счёту 4:
- на входном чипе - если со стороны интерфейсов на него поступает больше, чем он способен обработать.
- на фабрике коммутации (если коробка модульная) - если линейные карты пытаются отправить на фабрику больше, чем она способна обработать.
- на выходной линейной карте, если фабрика пытается передать на линейную карту больше, чем её чип способен обработать
- на выходном интерфейсе - если чип шлёт в интерфейс больше, чем тот способен сериализовать.
![]()
Attention
На самом деле фабрика без передподиски (или неблокируемая) - это та ещё спекуляция, к которой нередко прибегают маркетологи.Для некоторых сценариев, например, CIOQ даже со speedup фабрики в пару раз от необходимого есть строгие результаты, показывающие, при каких условиях она будет неблокируемой.Можно почитать у достопочтенных выпускников MIT и Стэнфорда: On the speedup required for combined input and output queued switching.
Архитектура буферов¶
И вот тут на сцену выходит TM - Traffic Manager, который реализует функции QoS (и некоторые другие). Он может быть частью чипа коммутации, а может быть отдельной микросхемой - для нас сейчас важно то, что он заправляет буферами.
Буфер - это с некоторыми оговорками обычная память, используемая в компьютерах. В ней в определённой ячейке хранится пакет, который чип может извлечь, обратившись по адресу.
Любой сетевой ASIC или NP обладает некоторым объёмом встроенной (on-chip) памяти (порядка десятков МБ). Так называемые Deep-Buffer свитчи имеют ещё внешнюю (off-chip) память, исчисляемую уже гигабайтами. И той и другой управляет модуль чипа - MMU.
В целом для нас пока местонахождение не имеет значения - взглянем на это попозже. Важно то, как имеющейся памятью чип распоряжается, а именно, где и какие очереди он создаёт и какие AQM использует.
И тут практикуют:
Crossbar¶
Идея в том, чтобы для каждой пары (входной интерфейс - выходной интерфейс) выделить аппаратный буфер.
Это, скорее, умозрительный эксперимент, потому что в плане сложности, стоимости реализации и эффективности это проигрышный вариант.
Output Queueing¶
Input Queuing¶
Более удачным вариантом оказывается буферизировать пакеты на входной плате после лукапа, когда уже становится понятно, куда пакет слать. Если выходной интерфейс заведомо занят, то и смысла гнать камикадзе на фабрику нет.
Постойте! Как же входной чип узнает, что выходной интерфейс не занят?
Combined Input and Output Queueing¶
Гораздо выгоднее в этом плане разрешить буферизацию и на выходе. Тогда арбитр будет проверять не занятость интерфейса, а степень заполненности выходного буфера - вероятность, что в нём есть место, гораздо выше.
Но такие вещи не даются даром. Очевидно, это и увеличенная цена из-за необходимости реализовывать дважды буферизацию, и увеличенные задержки - даже в отсутствие заторов этот процесс не бесплатный по времени.
Кроме того, для обеспечения QoS придётся хоть какой-то минимум его функций реализовывать в двух местах, что опять же скажется на цене продукта
Но у CIOQ (как и у IQ) есть фундаментальный недостаток, заставивший в своё время немало поломать голову лучшим умам - Head of Line Blocking.
Представьте себе ситуацию: однополосная дорога, перекрёсток, машине нужно повернуть налево, сквозь встречный поток. Она останавливается, и ждёт, когда появится окно для поворота. А за ней стоит 17 машин, которым нужно проехать прямо. Им не мешает встречный поток, но им мешает машина, которая хочет повернуть налево.
Этот избитый пример иллюстрирует ситуацию HoLB. Входной буфер - один на всех. И если всего лишь один выходной интерфейс начинает испытывать затор, он блокирует полностью очередь отправки на выходном чипе, поскольку один пакет в начале этой очереди не получает разрешение на отправку на фабрику.
Трагическая история, как в реальной жизни, так и на сетевом оборудовании.
Virtual Output Queueing¶
Как можно исправить эту дорожную ситуацию? Например, сделав три полосы - одна налево, другая прямо, третья направо.
Кстати, что касается трафика, который должен вернуться в интерфейс той же карты, на которую он пришёл изначально, то здесь никаких исключений - он томится в VOQ, пока чип не даст добро переложить его в выходную очередь. С тем только отличием, что пакет не будет отправляться на фабрику. Поэтому перед лицом перегрузок все равны.
Combined Input and Output Queueing w/ Virtual Output Queueing¶
Как сделать еще сложнее? Совместить обе вышепреведённые техники буферизации. VoQ применяется на фабрике, то есть только для виртуальных портов подключающих Switch Fabric к Egress Line Card NPU, таких портов в сторону NPU относительно немного и виртуальная очередь (VoQ) всё так же находится на Ingress Line Card.
Таким образом у каждого Ingress NPU есть виртуальные очереди для каждого из Egress NPU, таких очередей может быть несколько.
После того как трафик прошёл через фабрику минуя fabric VoQ, пакет в любом случае попадёт в очередь на исходящем интерфейсе (Egress Interface Output Queue) и или задержится там если в данный момент интерфейс перегружен, или сбросится если очередь заполнена полностью, или отправится дальше в исходящий интерфейс.
Данная техника не подвержена HoLB эффекту в той же мере что и классическая CIOQ, однако в случае когда трафик идёт на два разных исходящих интерфейса за одним NPU в случае затора на порту фабрики проблема HoLB всё таки может присутствовать.
CIOQ w/ VoQ fabric масштабируется гораздо лучше чем E2E VoQ из-за меньшего количества интерфейсов, а следовательно и очередей, поэтому подходит для PE, BNG и другого оборудования с большим количеством интерфейсов. Однако, недостаток двойной буферизации никуда не делся, как и недостаток размещения памяти в двух местах и как следствие бОльшего потребления энергии.
На сегодняшний день End-to-End VOQ является наиболее прогрессивной технологией, но говорить о её безоговорочной победе пока не приходится. Картинка с NANOG65 (2015):
Дальнейшее чтиво:
Shallow vs Deep Buffers¶
Чуть позже мы поговорим о том, что такое хорошо, а что такое плохо. А пока посмотрим на реализации.
Shallow - неглубокие - это буферы размером до 100МБ. Обычно это встроенная в кристалл on-chip память - OCB - On-Chip Buffer. Deep - счёт уже идёт на гигабайты. Обычно off-chip и подключается к чипу по отдельной шине. И нет ничего посередине.
Такие буферы порой даже называют Extremely shallow buffers.
Очевидно, что не для всех задач такие маленькие буферы подходят. В частности модульные коробки с VOQ явно не могут позволить себе дробить 64 Мб на несколько тысяч очередей (на самом деле могут).
Jericho2 несёт на борту новейшую память HBM2 - High Bandwidth Memory - размером 8ГБ.
- А вот и фото Jericho2:
Juniper PTX и QFX10000 используют чип Q5 собственного производства с внешней памятью - HMC - Hybrid Memory Cube - в размере 4ГБ.
А вот так выглядит сетевой процессор Cisco с внешней памятью:
Кастомный джуниперовский HMC обещает 1,25 Тб/с в обоих направлениях.
Если верить вики, то HBM 2-го поколения, используемый в последнем чипе Broadcom Jericho2, выдаёт порядка 2Тб/с.
Но это всё ещё далеко от реальной производительности сетевого ASIC. Фактически шины до этой внешней памяти является узким местом, которое и определяет производительность чипа.
Important
Когда-то мир был лучше и было строгое разделение - Shallow Buffer - это встроенная On Chip память, Deep Buffer - внешняя.С развитием WLP ситуация начинает меняться. Память HBM становится co-packaged в один чип вместе с комутационным асиком. TSV и 3D Advanced Packaging значительно увеличивают пропускную способность. И нередко в перезентациях вендорово можно увидеть “Deep Buffer” и “On Chip” в одной фразе.Тут нужно быть осторожным, поскольку шина между асиком и памятью, пусть даже они расположены рядышком на одном интерпозере под общей крышкой, всё ещё является узким местом и ограничивает максимальную пропускную способность.
Hybrid Buffering¶
Поэтому почти все вендоры сегодня практикуют гибридную буферизацию, или, если хотите - динамическую. В нормальных условиях используется только on-chip память, предоставляющая line-rate производительность. А в случае перегрузки пакеты автоматически начинают буферизироваться во внешней памяти. Это позволяет уменьшить стандартные задержки, энергопотребление и в большинстве случаев вписаться в ограниченную полосу пропускания до памяти.
Note
Данный параграф отменяет сказанное выше о том, что on-chip памяти не хватит для VOQ. Фактически в случае гибридной буферизации она всё же дробится на тысячи очередей очень маленькой длины, чтобы обеспечить VOQ. Просто в нормальных условиях этой длины хватает, чтобы пропускать трафик мимо внешней памяти.При этом в первую очередь начнёт офлоадиться на внешнюю память массивный трафик, идущий в низкоприоритетных очередях, а требовательный к задержками будет по-прежнему пролетать фаст-пасом.
Большие буферы - добро или зло?¶
В целом это довольно старая дилемма. Подольше похранить или пораньше дропнуть?
Соответственно на устройствах с глубокими буферами во время заторов пакеты будут долго копиться, не отбрасываясь. Когда они всё-таки дойдут до получателя и тот их ACKнет, отправитель не только не снизит скорость, но может даже её увеличить, если у него сейчас режим Slow Start или Congestion Avoidance.
Можно взглянуть и дальше: растущая очередь взвинчивает RTT, что соответственно влечёт за собой увеличение RTO таймеров на отправителях, тем самым замедляя обнаружение потерь.
Проект www.bufferbloat.net иронично определил этот термин, как «ухудшение производительности Интернета, вызванное предыдущими попытками её улучшения»
Отбросы - санитары сети. Ко всеобщему удивлению, уменьшение очереди до одного пакета зачастую может кардинально улучшить ситуацию, особенно в условиях датацентра (только не сочтите это за дельный совет).
Note
Справедливости ради следует заметить, что современные реализации TCP - BBR2, TIMELY ориентируются не только и не столько на потери, сколько на RTT и BDP.Гугловый QUIC - надстройку над UDP - следует отнести сюда же.
Итак, устройства с большим объёмом памяти годятся в места где заложена переподписка или могут появиться заторы.
Storage. Это штука крайне чувствительная к потерям и тоже гоняющая массивные объёмы данных. В случае хранилки тоже лучше не терять ничего. Но обычно она при этом и к задержкам предъявляет строгие требования, поэтому такие приложения обсудим пониже.
Однако при этом крайне редко они единственные потребители сети в датацентрах, другим приложениям нужна низкая задержка.
Впрочем, это легко решается выделением очередей QoS с ограничением максимальной доступной глубины. И весь вопрос заключается тогда только в том, готова ли компания заплатить за глубокие буферы, возможно, не использовать их и поддерживать конфигурацию QoS.
Но в любой ситуации лучше следовать правилу: use shallow ASIC buffers when you can and use deep buffers when you must.
Критика глубоких буферов:
Кстати, показательная таблица типичных задержек:
6. Low-latency lossless сети¶
Так что же можно сделать? На самом деле, как я уже говорил выше, условия сети датацентра хороши тем, что информация о перегрузке очень быстро доносится до отправителей. Поэтому и реакция на потерянный пакет не заставит себя долго ждать.
ECN-Based¶
Транзитное устройство, готовящееся испытать перегрузку, явным образом сообщает отправителям о том, что нужно охладить свою страсть.
Прозорливые инженеры заложили в IP целых 8 бит под QoS, и только 6 мы задействовали под DSCP, а 2 бита были зарезервированы для целей ECN - Explicit Congestion Notification.
Надолго забытый механизм сегодня извлекают из ящика стола, сдувают с него пыль, и вставляют в шкатулку, на которой нацарапано или DCTCP
Классический TCP может обнаружить только уже существующую перегрузку, а DCTCP, используя ECN, узнаёт о том, что она только приближается, и пробует её избежать.
Есть и другие реализации TCP, поддерживающие ECN, например, HTCP.
Bandwidth-Delay Product Based¶
Другие реализации замеряют эффективную полосу сети совместно с RTT, то есть сколько можно ещё напихать в трубу до того, как это создаст затор и увеличит задержку.
RTT-BASED¶
На самом деле, если бы не видео с прекрасной девушкой, рассказывающей про технические детали TIMELY, не знаю даже стал ли бы я упоминать про него. Наслаждайтесь, но берегите уши: TIMELY: RTT-based Congestion Control for the Datacenter.
7. Существующие чипы¶
До начала этого разговора следует сказать о разделении:
- Custom/In house Silicon. Это то, с чего всё начиналось - чипы, разработанные внутри R&D вендоров сетевых устройств: Cisco, Juniper итд. Используются они только внутри своего же оборудования и не продаются наружу.
- Commodity/Merchant Silicon. Чипы широкого производства. Можно их назвать рыночными или коммерческими. Это чипы, производимые сторонними компаниями: Broadcom, Innovium, Barefoot, Marvell итд.
Commodity/Merchant Silicon¶
Многие утверждают, что за рыночными чипами будущее (если уже не настоящее). Поэтому давайте с ними и познакомимся сначала.
Broadcom¶
Все сетевые ASIC Broadcom принадлежат двум семействам: StrataXGS и Strata DNX.
Strata DNX - чипы с глубокими буферами, рассчитанные на маршрутизаторы, модульные коммутаторы. Скорости при этом из всех семейств наиболее низкие. Названы в честь израильских городов: Arad, Qumran, Jericho, Jericho+, Jericho2.
Но если уйти за пределы ДЦ в любую сторону - в энтерпрайз, в провайдинг, в операторов, то Broadcom свои Трезубцы позиционирует уже как универсальные чипы, которые везде и на любом уровне сети сгодятся.
Почти два часа видео весьма технического склада:
- Introduction to Broadcom’s Switch Portfolio
- Broadcom Trident4: Disrupting the Enterprise Data Center & Campus
- Broadcom Tomahawk4: Industry’s Highest Bandwidth Chip
- Jericho2: Driving Merchant Silicon Revolution
- Хотел бы я, пожалуй, быть таким седовласым дедком, бегущим по лезвию современных технологий.
Hint
Кстати, будут у нас в гостях!
Mellanox¶
На сегодняшний день у них продаются свитчи на чипе Spectrum 2 с мощностью 6,4 Тб/с.
Оба чипа shallow-buffer, расcчитаны на коммутаторы уровней Leaf и Spine - высокая скорость, низкая задержка, не самая богатая функциональность.
Ходят слухи о разработке Spectrum 3, от которого ожидается 12,8 Тб/с, что позволит Mellanox’у почти догнать Broadcom.
Относить ли Mellanox к числу производителей рыночных ASIC’ов - вопрос в целом дискуссионный, но все делают именно так. Увы (а может и нет), они делает чипы только для своих коммутаторов, и не продают их наружу.
Note
К слову, в 2019-м Мелланокс был куплен Nvidia.
Hint
Кстати, были у нас в гостях.
Barefoot¶
Но сегодня программируемым конвейером хвастаются со сцен своих маркетинговых конференций уже почти все.
Note
К слову, в 2019-м Барефут был куплен Intel’ом.
Hint
Кстати, были у нас в гостях.
Marvell¶
Если загуглите в Яндексе “Marvell switch ASICs”, то не так уж много ссылок вас проведут туда, где вам будут рады. Marvell определённо делает интегральные микросхемы, и даже вполне определённо делает сетевые интегральные микросхемы, но назвать его фаворитом этой гонки язык не поворачивается.
У них есть три сетевых ASIC’а, вполне конкурентоспособных по заявленным функциям и мощностям:
- Prestera CX - 12.8 Тб/с, обещают программируемый Pipeline.
- Prestera PX - по всей видимости, что-то около 1 Тб/с на роль тора.
- Falcon - 12.8 Тб/с - видел несколько упоминаний о нём, но даже на самом сайте Marvell’а информации о нём нет.
Пожалуй, из последних предложений вы можете сделать закономерный вывод, что больше про Marvell я ничего не знаю.
Innovium¶
Другие¶
Есть и другие игроки, не снискавшие успеха среди гиперскейлеров.
Один из примеров - это Cavium. Приходилось слышать? Это вендор, купленный не так давно Marvell’ом и производящий NP для энтерпрайз-маршрутизаторов и (!!) базовых станций.
Для полноты картины приведу так же парочку малоизвестных компаний, которые производят низкоскоростные чипы коммутации на FPGA:
Custom silicon¶
Note
Занимательный факт. Во время санкционной войны лета 2019 у Huawei был невоображаемый сценарий вылететь с рынка - американская компания Broadcom заморозила поставку ASIC’ов для их линейки CloudEngine.Всё, конечно, завершилось хорошо.Но почти одновременно с этим вышел модульный коммутатор CE16800 на чипах собственного производства, и обещали пицца-боксы.Ясное дело, что занимались они этой разработкой уже довольно давно, наверно, лет 5.Однако сей факт намекает на то, что, возможно, не так уж и плоха идея вкладываться в разработку своих чипов.
Очевидно, что и у них не по одному типу ASIC’ов, развивающихся планомерно и интегрирующихся во все новые устройства - они делятся по сериям железок, по их ролям. Не забываем и о том, насколько большие компании любят поглощения.
Я не собираюсь здесь погружаться в детали, перечисляя все их виды и возможности. Пройдёмся только поверхностно по наиболее известным из них.
Juniper¶
Huawei¶
- Ascend для датацентров
- Solar для провайдеров и операторов
Cisco¶
Можно сказать, что новейшие линейки программируемых чипов это:
- Cisco Silicon One, установленный в линейку Cisco 8000.
- UADP - Unified Access Data Plane - программируемый ASIC для каталист и некоторых нексусов
- QFP - Quantum Flow Processor - для ASR и ESP
А в глубине веков начинается такой, зоопарк, что я просто кину несколько, даже не пытаясь докопаться до глубин:
- Sasquatch, Strider - каталисты 29хх и 3ххх
- K1, K2, K5, K10 - каталисты 4000 и 4500
- EARL1>EARL8 - ещё разнообразные каталисты и Nexus 7000
- Monticello - Nexus 3548
- Big Sur - Nexus 6000
- F3 - Nexus 7000/7700
- nPower X1 - сетевой процессор для NCS.
Замечательные слайды, кстати, о производстве цискиных чипов и их устройстве.
И слайды про использование рыночных чипов в нексусах и их (чипов) архитектуру.
Отечественная микроэлектроника¶
Merchant vs Custom¶
За¶
Против¶
В таком случае, что вендоров заставляет делать свои чипы, раз всё так хорошо?
А вот и оговорки с TTM - внести изменения в свой ASIC и выпустить следующую исправленную версию - проще и быстрее, чем запускать бюрократический маховик большой сторонней компании.
Кроме того, едва ли бродком возьмётся за реализацию проприетарных протоколов или других функций, которые нужны одному покупателю - это же массовый рынок.
Никуда не спрятать вопрос безопасности. Тут своё родное - знаешь каждую закладочку.
Не всегда может устроить реализация QoS на рыночных чипах. На своих можно замутить любые мутки.
Свой SDK - свои разработчики, которые его поправят. Чужой SDK - чужие баги, давайте сдавать, решать, тестировать - времени требуется значительно больше.
В общем, хорошо, что мы находимся сейчас в ситуации высококонкурентного рынка, и мы каждые полтора-два года можем получать ещё более мощные коммутаторы по ещё более низким ценам.
Ну а если вдруг вам надоели все эти наши Клозы и масс-маркет-силиконы, и душа просит чего-то совсем экзотического, то вот почитайте, как строятся суперкомпьютеры для High Performance Computing’а.
8. Путь пакета¶
Ну что же, кажется мы добрались до того момента, когда можно взглянуть на длинную и нелегкую жизнь, что предстоит прожить сигналу, несущему пакету.
Одночиповое устройство¶
Сначала рассмотрим пример попроще с single-chip shared buffer коробкой.
![]()
Оптический или электрический сигнал приходит в интерфейс.
Далее он попадает на чип PHY, который его усиливает, восстанавливает форму сигнала и синхронизацию (3R - Re-amplification, Re-shaping, Re-timing)
Из PHY сигнал по медным контактам бежит на SerDes чипа коммутации. Частота электрического сигнала здесь всё ещё десятки ГГц (для скоростей 10 Гб/с и выше). SerDes, понижает частоту (за счёт демодуляции NRZ, PAM4) до удобоваримой для чипа и передаёт его на модуль MAC.
MAC разбивает его на отдельные Ethernet-кадры. В этом ему помогает Inter-Frame Gap и преамбула, которые тут же за ненадобностью отбрасываются. Здесь же вычисляется контрольная сумма кадра, а потом сравнивается с хвостовым заголовком FCS.Если совпало, пакет без FCS передаётся дальше. Если нет - тут же отбрасывается, а счётчик ошибок на интерфейсе увеличивается на 1.Далее этот Ethernet кадр ещё со всем заголовками отправляется на Parser. Тот отделяет управляющие заголовки от тела. Тело он складывает во встроенный буфер. Причём оно расчленяется на ячейки, чтобы плотно упаковаться в доступные сегменты памяти. Управляющими являются те заголовки, на основе которых применяется решение о маршрутизации пакета - Ethernet, MPLS, IP, TCP/UDP (для ACL и LAG/ECMP).
Пока тело хранится в буфере, набор заголовков передаётся на анализ в блок Match-Action.
Сначала изучается Dst MAC. FE делает лукап в MAC-таблице (например, в памяти CAM). Если DMAC совпадает с MAC’ом самого узла, то кадр передаётся на обработку по конвейеру дальше. Если нет, то кадр коммутируется согласно таблице и на этом всё.
Если MACи совпали, то кадр на основе EtherType передаётся следующему блоку (MPLS или IP).Какие же данные из заголовка понадобятся?
- Значение TTL/Hop Limit.
- Адрес назначения (IP, MPLS-метка итд.)
- Приоритет (DSCP, EXP итд.)
- Возможно понадобятся и другие поля, такие как адрес источника, информация о вложенных данных (протокол, порт, приложение)
Пока тело всё ещё прохлаждается во внутричиповом буфере, происходит принятие десятков решений о его судьбе:
Уменьшение TTL/Hop Limit на 1 и проверка, не равен ли он 0. Если равен - то запрос на CPU для генерации ICMP TTL Expired in Transit.
Проверка по ACL - можно ли вообще передавать этот трафик.
Принятие решения о назначении пакета на основе Dst IP или верхней MPLS-метки.
Входной тракт чипа коммутации здесь делает лукап в FIB в попытке найти маршрут, соответствующий данному IP-адресу (или в LFIB, для поиска LSP). Будь то поиск в TCAM или запрос в блок алгоритмического поиска результатом будет указатель в RAM, где хранится искомая запись с набором инструкций.
Чип из RAM получает этот набор инструкций: выходной интерфейс, NextHop, инкапсуляции, выходной стек меток итд. При необходимости осуществляется рекурсивный лукап. В большинстве случаев чип коммутации выясняет на этом шаге MAC-адрес Next-Hop’а из таблицы соседей (Adjacenсies Tables/ND Tables).
Если некстхопов несколько, а соответственно и несколько комбинаций (выходной интерфейс, инкапсуляция), то чип считает хэш от полей заголовков для определения в какой из членов LAG или ECMP послать этот пакет.
Если адрес назначения локальный, то или парсится следующий заголовок (как это и было выше с Ethernet), или принимаются какие-то меры аппаратные (BFD, например) или пакет передаётся на CPU (BGP, OSFP итд.)
Преобразование приоритета из заголовков пакета во внутреннюю CoS-метку, в соответствии с которой пакет будет обрабатываться в пределах данного узла. Может навешиваться приоритет обработки в очередях и приоритет отбрасывания пакета.
Всё это станет метаданными и будет помещено во временный заголовок, сопровождающий пакет до выходного тракта:
- Выходной интерфейс
- Приоритет
- TTL
- Next Hop/стек меток
- Другое
Для BUM трафика модуль Match-Action определяет список выходных интерфейсов, но не создаёт реплики пакета - эта информация добавляется в метаданные.
Note
Важно понимать, что до завершения этого шага никаких решений о перегрузках, отбрасывании пакетов и очередях не принимается - тело пакета в любом случае сохраняется в буфере на время обработки заголовков и поиска выходного интерфейса
Эстафета передаётся модулю TM. Он ведёт всю бухгалтерию, касающуюся QoS: Congestion Avoidance, Congestion Management, диспетчеризация, управление задержками, шейперы, полисеры итд. Соответственно для данного пакета принимается решение в какую очередь его поместить, в какой цвет окрасить, сколько токенов из бакета он съест. Решения принимаются на основе заголовков пакета и конфигурации QoS.Если интерфейс, в который предстоит попасть пакету, испытывает перегрузку, то пакет может быть записан в низко- или высоко- приоритетную очередь в соответствии со своими заголовками. Может быть дропнут, если сработает механизм WRED/Tail Drop. А если настроен PFC, то он может быть записан в Headroom-буфер, чтобы сохранить его любой ценой, когда всякое вакантное место уже отсутствует в общей памяти.Если пакету повезло попасть в очередь, то TM должен согласно механизмам диспетчеризации в нужный момент времени извлечь его для отправкиЕсли пакет BUM, то тут же на TM родятся его копии, каждая со своим набором метаданных. .. note:: Тут важно понимать, что все манипуляции и передвижения (даже постановка в очередь и извлечение из неё) проводятся как бы виртуально - с метаданными, а не с телом пакета - оно преспокойно лежит всё это время на одном месте (если мы говорим про вариант с Shared Buffer)Далее из модуля TM метаданные о пакете кочуют в Egress Match-Action, где над ними производятся дополнительные экзекуции, в виде, например, выходных ACL.
Deparser получает метаданные, формирует из них стек заголовков. В частности здесь он преобразует внутренний приоритет в значения приоритетов IP/MPLS/Ethernet, записывает правильный TTL, пересчитывает контрольные суммы итд. Так же Deparser извлекает бренное тело из буфера, склеивает его с новыми заголовками, и передаёт блоку MAC.
И потом всё раскручивается в другую сторону: MAC добавляет IFG, преамбулу, считает новую контрольную сумму кадра и добавляет трейлер FCS.
SerDes теперь повышает частоту и отправляет сигнал в медные дорожки.
PHY готовит сигнал для передачи в среду (медь, оптика, радио).
С порта счастливый пакет уходит в своё короткое (или не очень) плавание до следующей пристани.
Note
Это, несомненно очень упрощённый пример обработки трафика. Более того, он рассматривает частный пример реализации. Фактически чип MAC может стоять отдельно от чипа коммутации, или наоборот PHY быть его частью. PHY может самостоятельно понижать частоту, и тогда не нужны SerDes. Репликация BUM может происходить на TM, а может на выходном тракте. Дорожки, в случае Silicon Photonics будут не электрическими, а оптическими. И много прочих нюансов
Если заменить Shallow Buffer на Deep Buffer, то в случае перегрузок тело пакета может сохраняться на внешнюю память.
Многочиповое устройство¶
Нередки случаи, когда в одну коробку ставится два-три и больше чипов для увеличения производительности.
Тогда входному чипу коммутации нужно ещё определить и выходной чип во время лукапа и указать его в метаданных. Поскольку обработка будет происходить дважды на двух разных чипах, естественно, тело пакета передаётся между ними и буферизируется дважды. Тут возможны разные архитектуры памяти, но VOQ одна из наиболее удобных - буфер выходного чипа в этом случае используется только как FIFO, а вся нагрузка по обеспечению QOS ложится на входной TM.
Модульное устройство¶
Значительно усложняется картина в случае шассийных коробок. Добавляется VOQ на входном чипе, фабрика, обработка на выходном, арбитраж с пиггибэком.
Для шассийных коробок процесс изменится так.
То есть чип из RAM должен извлечь следующий набор инструкций: выходной чип, выходной интерфейс, NextHop, инкапсуляции, выходной стек меток итд.
И следующие метаданные будут привязаны к пакету:
- Выходной чип
- Выходной интерфейс
- Приоритет
- TTL
- Next Hop/стек меток
- Другое
С BUM трафиком ситуация тоже не меняется - модуль Match-Action определяет список выходных чипов и интерфейсов и вносит это в метаданные.
У TM тоже работы прибавляется.
В подавляющем большинстве случаев на линейных картах модульных шасси будет VOQ на входе. То есть для каждого возможного выходного интерфейса (по сути для всех существующих) будет создана очередь на выходном чипе. TM, уже обладая информацией о том, куда пакет должен быть направлен, помещает его в очередь, отвечающую за данный выходной интерфейс. И соответственно поступает с ним так, как того требуют приоритет пакета, условия перегрузок, настроек QoS на данном конкретном порту.
Если используется арбитр (а он используется, бьюсь об заклад), то TM должен ещё и на отправку пакета получить разрешение от выходного чипа, чтобы быть уверенным, что этот пакет не будет отброшен из-за конгестии на выходном порту.
Ну и кроме всего прочего TM должен выполнить репликацию BUM-пакетов. Но не во все порты, за которыми есть получатели этого трафика, а только по числу выходных чипов, за которыми они есть. Что и логично, чтобы не забивать фабрику.
Ну а дальше у пакета недолгий путь через фабрику коммутации. В этом путешествии ему не обойтись без верного спутника - временного заголовка с его метаданными.
Пакет обычно шинкуется на ячейки одинакового размера, каждой из них приклеивается этот метазаголовок и порядковый номер, и отправляется на фабрику.
На выходной плате ячейки обратно спекаются в один пакет и попадают на TM. В целом в зависимости от реализации здесь чего с ним только может не происходить, но базовый минимум - это просто FIFO очередь (потому что QoS отработал на входной плате) и репликация BUM-пакетов по числу портов-подписчиков.
Следующим пристанищем пакета становится выходной чип коммутации. Здесь могут приниматься ещё какие-то решения о передаче, например, выходные ACL.
Ну а дальше Deparser → MAC → SerDEs → PHY → интерфейс → среда
Локальные пакеты¶
Бо́льшая часть локальных пакетов обрабатываются на ЦПУ.
Напомню, что локальные - это те, которые были созданы на данном узле или которые предназначены именно ему (юникастовые), которые предназначены всем/многим (броадкастовые или мультикастовые). К ним относятся пакеты протоколов Control Plane (BGP, OSPF, LDP, LLDP итд), пакеты протоколов управления (telnet, SSH, SNMP, NetConf итд), пакеты ICMP.
К ним же стоит отнести транзитные протоколы, требующие обработки Control Plane’ом узла (TTL Expired, Router Alert).
Входящие¶
Вплоть до блока Match-Action с ними происходит всё то же самое, что и с транзитными. Далее чип коммутации, обратившись в таблицу MAC-адресов , видит, что DMAC - это MAC-адрес локального устройства, заглядывает в EtherType. Если это какой-нибудь BPDU или ISIS PDU, то пакет сразу передаётся нужному протоколу.
Если IP - передаёт его модулю IP, который, заглядывая в FIB, видит, что и Dst IP тоже локальный - значит нужно посмотреть в поле Protocol заголовка IPv4 (или Next Header IPv6).
Определяется протокол, принимается решение о том, какому модулю дальше передать пакет - BFD, OSPF, TCP, UDP итд. И так пакет разворачивается до конца, пока не будет найдено приложение назначения.
Если данный пакет принёс информацию об изменении топологии (например, новый OSPF, LSA), Control Plane должен обновить Soft Tables (RAM), а затем изменения спускаются в Hard Tables (RAM/CAM/TCAM+RAM).
Если пакет требует ответа, то устройство должно его сформировать и отправить назад изначальному источнику (например, TCP Ack на пришедший BGP Update) или передать куда-то дальше (например, OSPF LSA или RSVP Resv).
Исходящие¶
Исходящие протокольные пакеты формируются на ЦПУ - он заполняет все поля всех заголовков на основе Soft Tables и далее, в зависимости от реализации, спускает его на Ingress или Egress FE.
Attention
Из-за того, что пакет сформирован на процессоре, зачастую он не попадает под интерфейсные политики. Архитектурно многие операции, выполняющиеся на FE, требуют того, чтобы FE производил Lookup и формировал заголовки.Отсюда могут быть любопытные и неочевидные следствия, например, их не получится отловить ACL, вы можете не увидеть их в зазеркалированном трафике, они не будут учитываться при ограничении скорости. Но это зависит от вендора и оборудования.Однако политики, работающие с очередями на CPU их, конечно, увидят.
Есть некоторые протоколы Control Plane, которые всё-таки обрабатываются в железе. Ярким примером может служить BFD. Его таймеры выкручиваются вплоть до 1 мс. CPU, как мы помним, штука гибкая, но неповоротливая, и пока BFD-пакет пройдёт по всему тракту и развернётся до заголовка BFD, пока до процессора дойдёт прерывание, пока тот на него переключится, прочитает пакет, сгенерирует новый, вышлет его, пройдут десятки и сотни миллисекунд - глядь, а BFD-то уже развалился.
Поэтому пакеты BFD в большинстве случаев разбираются на чипе, на нём же и готовится ответ. И только сама сессия устанавливается через CPU.
..note:: Большие в этом вопросе пошли ещё дальше, перенеся на железо наиболее рутинные операции. Так, например, Juniper ввёл PPM - Periodic Packet Management, который разделяет функции Control Plane некоторых протоколов между управляющим модулем и интерфейсным:
- Bidirectional Forwarding Detection (BFD)
- Connectivity Fault Management (CFM)
- Link Aggregation Control Protocol (LACP)
- Link Fault Management (LFM)
- Multiprotocol Label Switching (MPLS)
- Real-time Performance Monitoring (RPM)
- Spanning Tree Protocol (STP)
- Synchronous Ethernet (SYNCE)
- Virtual Router Redundancy Protocol (VRRP)
Note
История выше отсылает нас к длинным пингам. Иногда инженер проверяет RTT своей сети путём пинга с одного маршрутизатора на другой. Видит вариацию в десятки и сотни мс и, начиная переживать, открывает запросы вендору. Пугаться тут нечего. Обычно ICMP обрабатывается на CPU. И именно занятостью процессора определяется время ответа. При этом корреляция с реальным RTT сети практически нулевая, потому что транзитный трафик на CPU не обрабатывается.Некоторые современные сетевые устройства могут обрабатывать ICMP-запросы и формировать ICMP-ответы на чипе (NP, ASIC, FPGA), минуя долгий путь до CPU. И вот в этом случае циферки в ping будут адекватны реальности. Но я бы всё же на это не полагался
9. Заключение¶
Полезные ссылки¶
В этот раз хоть под кат убирай. Но, поверьте, я оставил тут только самые хорошие источники, прочитанные лично моими глазами и отобранные лично моими руками.
Архитектура сетевых устройств
Архитектура ASIC
- Packet Pushers. Understanding ASICs For Network Engineers (Pete Lumbis
- Cisco Enterprise ASICs
- Broadcom Ships Jericho2
- Broadcom Launches Another Tomahawk Into The Datacenter
- Programmable Pipeline
- The Most Important Development Of This Century
- Understanding chiplet in one article
- Advanced_packaging_five_trends_to_watch_in_2017.aspx# Advanced packaging: five trends to watch in 2017
- Fan Out – Simple to Complex
Программируемость
Архитектура памяти
- Packet Buffers. Отсюда по ссылкам разворачиваются разнообразные материалы очень глубоко
- An Update on Router Buffering
- NCS 5500 Buffering Architecture
- Cisco Nexus 5000 Series Switches. Cut-through and Store-and-Forward
- Understanding CoS Flow Control (Ethernet PAUSE and PFC
- Quality of Service.Headroom buffers.
Реализации очередей
Deep Buffers
Data Center TCP (DCTCP): TCP Congestion Control for Data Centers
Ну и немного мотивационных видео от Broadcom
Спасибы¶
- Андрею Глазкову (glazgoo) за рецензию и дельные замечания о Shared Buffers и коммерческих чипах
- Михаилу Соколову (insektazz) за разъяснения об устройстве чипов, SerDes и Silicon Photonics
- Александру Клименко (v0lk) за обнаружение точек роста в вопросах Admission Control, Alpha, Pipeline’ов и минусов DCTCP
- Александру Азимову (mitradir) за комментарии о Lossless Ethernet
- Дмитрию Афанасьеву (fl0w) за дополнения ко всем частям статьи
- Виталию Венгловскому (AllTheThingsUndone) за наставление на путь в вопросах On-Chip Buffer, Packaging и других
- Наташе Самойленко за помощь с RTD. Благодаря ей вы можете скачать эту книгу в PDF.
- Артёму Чернобаю за КДПВ
Особо благодарных просим задержаться и пройти на Патреон.