5. Память и буферы

Ну вот мы и добрались до ниточки, с которой клубок начал распутываться.

Всё, что было выше, касалось заголовков пакетов - они отделялись и подвергались алгоритмическим экзекуциям в пайплайне.
А где же прохлаждались их тела всё это время?

В сетевых чипсетах есть встроенная память (OCB - On Chip Buffer) как раз для хранения тел. Её размер в силу физических ограничений очень мал (до 100Мб), но для большинства задач - это разумный компромисс.

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

Note

Бывают редкие исключения, где встроенная память имеет больший размер.
Но всегда были и будут сценарии, в которых нужна память гораздо большего объёма, в этом случае прибегают к использованию внешней относительно чипа коммутации памяти. Такие устройства называются Deep Buffer.
И о них и вообще о компромиссах мало-много памяти поговорим отдельно.
Таким образом на входе в чип парсер отделяет заголовки от тел, первые отдаёт на анализ в блок Match-Action, вторые - складывает в буфер.
На выходе новые заголовки пришивают к извлечённым обратно телам и отправляют на выход.
Будучи неоднократно обвинённым при рецензировании этой статьи, чувствую необходимость ещё раз повторить это: внутри чипа коммутации заголовки отделяются от тела пакета. В то время, как изначальные заголовки анализируются, помогают сделать лукап, уничтожаются, формируются новые, тело находится в одном месте физической памяти, не перемещаясь. Даже в тот момент, когда Traffic Manager выстраивает пакеты в очередь согласно их приоритетам, производит их диспетчеризацию и Congestion Avoidance, фактически он работает со внутренними временными заголовками, не двигая пакеты по памяти.

Управляет доступом к физической памяти MMU - Memory Management Unit. Он довольно похож на MMU в компьютерах (по сути является им). Программа обращается к указателю, чтобы извлечь данные из памяти, MMU транслирует это в реальный адрес ячейки и возвращает данные.

MMU занимается размещением пакетов в буферах, их извлечением или отбрасыванием. Он же контролирует разделение памяти на области (dedicated, shared, headroom, voq) и их загрузку.

За более верхнеуровневое управление очередями и перегрузками отвечает блок TM - Traffic Manager.

Есть два подхода к размещению тел в буферах: Store-and-Forward и Cut-Through.