Реклама:

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

Основные сведения о сетях

Вычислительные сети подразделяются на два основных вида: локальные сети (Local Area Networks, LAN) соединяют компьютеры, расположенные в одном помещении или здании, а глобальные сети (Wide Area Networks, WAN) связывают компьютеры, находящиеся на значительном расстоянии друг от друга. Наиболее популярный тип локальных сетей называется Ethernet. Первоначально простая сеть Ethernet состояла из толстого кабеля, к которому с помощью устройства под ироничным названием зуб вампира (vampire tap) подводились провода от входящих в сеть компьютеров. В современных сетях Ethernet компьютеры подключаются к центральному коммутатору (он показан справа на рис. 8.11). В первых версиях Ethernet скорость передачи данных ограничивалась значением 3 Мбит/с, а в первой коммерческой версии она увеличилось до 10 Мбит/с. Впоследствии появились версии Fast Ethernet и Gigabit Ethernet со скоростями передачи 100 Мбит/с и 1 Гбит/с соответственно. Не так давно выпущена коммерческая версия со скоростью 10 Гбит/с, а в недалеком будущем скорость возрастет до 40 Гбит/с.

Сетевые процессоры

Рис. 8.11. Схема подключения пользователей к серверам Интернета

Организация глобальных сетей не столь единообразна. В таких сетях устанавливаются компьютеры, называемые маршрутизаторами, между которыми прокладываются проводные или оптоволоконные каналы. От исходного компьютера к целевому данные передаются в виде небольших блоков по 64-1500 байт, называемых пакетами. На каждом ретрансляционном участке, или хопе, пакет сначала сохраняется в памяти маршрутизатора, а затем отправляется дальше, как только освободится необходимая линия связи. Такой подход называется коммутацией с сохранением и продвижением пакетов (store-and-forward packet switching).

Хотя многим кажется, что Интернет является глобальной сетью, технически он представляет собой объединение большого числа разнообразных сетей. Впрочем, это различие для дальнейшего рассмотрения непринципиально. На рис. 8.11

структура Интернета показана с точки зрения домашнего пользователя. Компьютер такого пользователя обычно обращается к веб-серверам через телефонную линию, подключаясь к ней либо при помощи обычного модема, либо через линию ADSL (см. главу 2). Для подключения может также использоваться кабель кабельного телевидения. В этом случае правая часть рис. 8.11 будет выглядеть немного иначе, поскольку поставщиком приложений будет компания кабельного телевидения. Итак, компьютер пользователя разбивает данные на пакеты, чтобы передать их специальной компании, которая называется поставщиком услуг Интернета (Internet Service Provider, ISP). Сам поставщик услуг Интернета использует высокоскоростное соединение (обычно по оптоволокну) с одной из региональных или магистральных сетей, составляющих Интернет. Пакеты передаются между компьютерами сети, перемещаясь хоп за хопом к серверу.

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

Сетевое программное обеспечение состоит из нескольких протоколов, каждый из которых представляет собой набор форматов, последовательностей обмена и правил, определяющих назначение пакетов. Например, когда пользователь хочет получить веб-страницу с сервера, его браузер по протоколу HTTP (Hyper-Text Transfer Protocol - протокол передачи гипертекста) отправляет пакет с запросом GET PAGE серверу, который "знает", как обрабатывать полученный пакет. В процессе передачи используются множество различных протоколов, причем зачастую совместно. Обычно они организованы в иерархическую многоуровневую структуру, в которой протоколы верхнего уровня передают пакеты протоколам нижележащих уровней, а реальной передачей данных занимается протокол самого нижнего уровня. На стороне получателя пакеты поднимаются вверх по иерархии в обратном порядке.

Раз сетевые процессоры заняты выполнением протоколов, перед изучением процессоров имеет смысл поговорить о протоколах немного подробнее. Вернемся ненадолго к запросу GET PAGE. Как именно он попадает на веб-сервер? Прежде всего, браузер устанавливает с сервером соединение по протоколу TCP (Transmission Control Protocol - протокол управления передачей). Программное обеспечение, реализующее этот протокол, следит за тем, чтобы все отправленные пакеты были доставлены, причем в правильном порядке. В случае потери пакета программное обеспечение TCP максимально быстро повторяет передачу до тех пор, пока пакет, наконец, не будет получен.

Реально происходит следующее. Браузер формирует корректное HTTP-сообщение с запросом GET PAGE, а затем передает его программному обеспечению TCP, которое и передает пакет через соединение. Программным обеспечением TCP в начало сообщения добавляется заголовок, содержащий порядковый номер и другую информацию. Этот дополнительный заголовок называется ТСР-заголовком.

Сделав свою часть работы, программное обеспечение TCP передает ТСР-за-головок вместе с полезной нагрузкой (содержащей запрос GET PAGE) еще одной программе, реализующей протокол IP (Internet Protocol - межсетевой протокол). Эта программа добавляет в начало пакета IP-заголовок с информацией об адресах отправителя (то есть машины, передающей пакет) и получателя (машины, ожидающей пакет), максимальном числе хопов, двигаясь вдоль которых пакет будет существовать (чтобы "потерявшиеся" пакеты не жили вечно, заполоняя собой весь Интернет), контрольной суммой (для обнаружения ошибок памяти и ошибок передачи) и рядом других полей.

Далее пакет (включающий в себя IP-заголовок, TCP-заголовок и сам запрос GET PAGE) передается "вниз" на уровень канала передачи данных, который добавляет к пакету свой заголовок и передает пакет по линии связи. Этот уровень также дописывает в конец контрольную сумму, называемую CRC (Cyclic Redundancy Check - циклический контроль избыточности) и позволяющую выявлять ошибки передачи. Может показаться, что две контрольные суммы, на уровне IP и на уровне канала данных - это больше, чем необходимо, но такой подход повышает надежность. На каждом хопе проверяется CRC-код пакета, после чего заголовок вместе с CRC-кодом генерируются заново, в соответствии с требованиями исходящего канала передачи данных. На рис. 8.12 показано, что представляет собой пакет в Ethernet. Случай телефонной линии отличается только тем, что вместо Ethernet-заголовка имеется заголовок коммутируемой линии. Обработка заголовков - одна из важных задач, которую призваны решать сетевые процессоры. Конечно, излишне упоминать о том, что мы лишь вскользь коснулись темы вычислительных сетей. За более детальными сведениями обращайтесь к [202].

Сетевые процессоры

Рис. 8.12. Вид Ethernet-пакета

Основные сведения о сетевых процессорах

К сети подключаются самые разные устройства. Для конечных пользователей это, прежде всего, персональные компьютеры (настольные и ноутбуки), но растет также число игровых консолей, персональных электронных секретарей (карманных компьютеров), сотовых телефонов. Для компаний роль оконечных систем играют серверы и персональные компьютеры. Помимо этого, в сетях функционирует бесчисленное количество разнообразных промежуточных устройств, в их число входят маршрутизаторы, коммутаторы, брандмауэры, прокси-серверы, системы балансировки нагрузки. Достаточно любопытно, что к этим промежуточным системам предъявляются самые серьезные требования - именно они должны обеспечивать передачу максимального числа пакетов в секунду. Кроме того, серьезные требования налагаются на серверы, что касается пользовательских компьютеров, то к ним особых требований нет.

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

Когда скорость передачи данных в локальной сети приближается к 40 Гбит/с, а размер пакета - к 1 Кбайт, сетевой компьютер должен обрабатывать почти 5 млн. пакетов в секунду. Для пакетов размером 64 байт это значение возрастает примерно до 80 млн. пакетов в секунду. Выполнение всех упомянутых функций за время порядка 12-200 не, в дополнение к неизменно необходимому копированию пакетов, просто невозможно реализовать программно. Аппаратная поддержка здесь принципиально необходима.

Одним из путей аппаратного решения проблемы быстрой обработки пакетов является использование специализированных интегральных схем (Application-Specific Integrated Circuit, ASIC). Такая микросхема подобна аппаратно реализованной программе, которая может выполнять любое из заранее предусмотренных действий. Основой многих современных маршрутизаторов являются схемы ASIC. Впрочем, и со специализированными интегральными схемами связаны некоторые проблемы. Прежде всего, их долго проектировать и не менее долго производить. Кроме того, это жестко запрограммированные устройства, то есть чтобы внести новую функциональность, приходится разрабатывать и изготавливать новую микросхему. Хуже того, настоящим кошмаром являются ошибки, так как единственным способом их исправления является разработка, изготовление и установка новой (исправленной) микросхемы. Наконец, этот подход является весьма затратным, если только большой объем производства не позволяет компенсировать расходы на разработку.

Второй подход основан на использовании программируемых вентильных матриц (Field Programmable Gate Array, FPGA). Такая матрица представляет собой набор вентилей, из которых путем перекоммутации строится требуемая схема. Сроки выхода программируемых вентильных матриц на рынок гораздо короче, чем у специализированных интегральных схем, к тому же их можно перепрограммировать в "полевых условиях" при помощи специального программатора. Но в то же время они очень сложные, дорогие и более медленные, чем схемы ASIC, поэтому программируемые вентильные матрицы не получили широкого распространения, исключая некоторые узкоспециальные области.

Наконец, перейдем к сетевым процессорам - устройствам, способным обрабатывать входящие и исходящие пакеты со скоростью их передачи, то есть в реальном времени. Обычно они реализуются в виде съемной платы, содержащей, помимо кристалла сетевого процессора, память и вспомогательную логику. К плате подключается одна или несколько сетевых линий. Процессор получает из линии пакеты, обрабатывает их, после чего передает по другой линии, если это маршрутизатор, или отправляет в главную системную шину (то есть в шину PCI), если это оконечное устройство, которым может быть, например, персональный компьютер. Типичный сетевой процессор и его плата показаны на рис. 8.13.

Обычно на плате имеется как статическая (SRAM), так и синхронная динамическая оперативная память (SDRAM) - эти виды памяти применяются для разных целей. SRAM быстрее SDRAM, но из-за дороговизны памяти этого типа обычно немного. Она используется для хранения таблиц маршрутизации и прочих ключевых структур данных, в то время как в SDRAM записываются сами обрабатываемые пакеты. Благодаря тому, что память обоих этих типов располагается вне кристалла сетевого процессора, можно гибко подойти к вопросу о выборе объема памяти. Так, в простых системах с единственной сетевой линией (такие платы могут ставиться, например, в персональный компьютер или сервер) памяти может быть немного, в то время как маршрутизатору ее требуется намного больше.

Сетевые процессоры

Рис. 8.13. Кристалл и плата типичного сетевого процессора

Сетевые процессоры оптимизированы для быстрой обработки большого количества входящих и исходящих пакетов. Это означает, что по каждой из сетевых линий проходят миллионы пакетов в секунду, а маршрутизатор должен поддерживать десятки таких линий. Столь серьезных показателей можно достигнуть только на процессорах с высокой степенью внутреннего параллелизма. Кроме того, в процессор обязательно входят несколько РРЕ-контроллеров (Protocol/ Programmable/Packet Processing Engine - программируемая система обработки пакетов и протоколов), каждая из которых состоит из RISC-ядра (возможно, модифицированного) и внутренней памяти небольшого объема для хранения программы и нескольких переменных.

Есть два подхода к организации РРЕ-контроллеров. В простейшем случае все РРЕ-контроллеры делаются идентичными. Когда в сетевой процессор приходит новый пакет, он передается для обработки тому РРЕ-контроллеру, который в данный момент бездействует. Если свободных РРЕ-контроллеров нет, пакет ставится в очередь в расположенной на плате памяти SDRAM, ожидая освобождения одного из РРЕ-контроллеров. При такой организации горизонтальные связи, показанные на рис. 8.13, отсутствуют, так как у разных РРЕ-контроллеров нет необходимости общаться друг с другом.

Другой подход к организации РРЕ-контроллеров - конвейер, где каждый из РРЕ-контроллеров выполняет один этап обработки, после чего передает указатель на полученный пакет следующему РРЕ-контроллеру в конвейере. Такой конвейер работает во многом аналогично конвейерам ЦП, которые рассматривались в главе 2. В обоих вариантах организации РРЕ-контроллеры являются полностью программируемыми.

В более совершенных сетевых процессорах РРЕ-контроллеры поддерживают многопоточность, то есть каждый из них имеет несколько наборов регистров и аппаратный регистр, показывающий, какой из наборов используется. Это позволяет одновременно выполнять несколько программ (то есть программных потоков) и переключаться между ними, просто изменяя переменную "текущего рабочего набора регистров". Когда один из программных потоков вынужден ждать (например, при обращении к SDRAM, на которое требуется несколько циклов), РРЕ-контроллер может быть мгновенно переключен на поток, способный продолжать работу. Это позволяет добиваться высокой загрузки РРЕ-контроллеров, даже несмотря на необходимость часто ожидать завершения обмена данными с SDRAM или других медленных внешних операций.

Помимо РРЕ-контроллеров, у всех сетевых процессоров имеется управляющий процессор для выполнения всех действий, не относящихся напрямую к обработке пакетов (например, обновление таблиц маршрутизации). Обычно он представляет собой RISC-процессор общего назначения, память для данных и команд которого находится на одном кристалле с процессором. Более того, в сетевом процессоре может быть несколько специализированных процессоров, предназначенных для выполнения критически важных операций. Они представляют собой очень маленькие специализированные интегральные схемы (ASIC), способные выполнять только одно несложное действие, такое как поиск целевого адреса в таблице маршрутизации. Все компоненты сетевого процессора взаимодействуют друг с другом на мультигигабитных скоростях по одной или нескольким расположенным на кристалле параллельным шинам.

Обработка пакетов

Независимо от того, имеет сетевой процессор конвейерную или параллельную организацию, каждый прибывший пакет проходит несколько этапов обработки. У некоторых процессоров эти этапы разделяются на входную (ingress processing) и выходную обработку (egress processing). К первой группе относятся операции с пакетами, пришедшими извне (через сетевую линию или системную шину), а ко второй - с пакетами перед их отправкой. Таким образом, каждый пакет подвергается сначала входной обработке, а затем выходной. Это разделение достаточно условно, так как некоторые операции можно производить на любом из этапов (например, сбор сведений о трафике).

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

1. Проверка контрольной суммы. Если входящий пакет прибывает из сети Ethernet, его контрольная сумма (CRC-код) пересчитывается и сравнивается со значением, имеющемся в пакете, чтобы убедиться, что пакет принят без ошибок.

Если оба значения оказываются равными или поле CRC в Ethernet-пакете отсутствует, вычисляется контрольная сумма IP-пакета и сравнивается со значением в пакете. Это позволяет убедиться, что IP-пакет не был поврежден по вине сбойного бита в памяти отправителя после того, как отправителем была посчитана контрольная сумма для IP-пакета. Если все проверки пройдены, пакет передается для дальнейшей обработки, в противном случае он просто отбрасывается.

2. Извлечение значений полей. Путем анализа определяется положение нужного заголовка, и из пакета извлекаются значения соответствующих этому заголовку ключевых полей. В Ethernet-коммутаторе исследуется только Ethernet-заголовок, в IP-маршрутизаторе - только IP-заголовок. Значения ключевых полей сохраняются либо в регистрах (при параллельной организации РРЕ-контроллеров), либо в SRAM (при конвейерной организации).

3. Классификация пакетов. Пакеты классифицируются в соответствии с рядом программных правил. В простейшем случае пакеты данных отделяются от управляющих пакетов, но обычно разделение гораздо более тонкое.

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

5. Определение целевой сети. В IP-пакетах содержится 32-разрядный адрес получателя. Однако невозможно (и нежелательно) использовать для поиска получателя каждого пакета целую таблицу из 232 записей. Поэтому левая часть адреса обычно содержит адрес сети, а правая указывает на отдельную машину в этой сети. Длина адреса сети не фиксирована, поэтому его определение - задача нетривиальная, причем ее еще больше усложняет тот факт, что допустимы несколько вариантов, из которых правильным считается самый длинный. На этом шаге часто применяется специализированная интегральная схема.

6. Поиск маршрута. После определения адреса целевой сети по таблице, хранящейся в памяти SRAM, выясняется, по какой из исходящих линий отправить пакет. Опять же, на этом шаге может применяться специализированная интегральная схема.

7. Разбивка и сборка. Приложения часто максимально увеличивают полезную нагрузку (данные) TCP-пакетов, стараясь сократить количество системных вызовов, но и у TCP, и у IP, и у Ethernet есть ограничения на максимальный размер пакета. Как следствие этих ограничений, может потребоваться разбивать пакеты (и, соответственно, полезную нагрузку) на части перед отправкой и собирать их снова на приемной стороне. Эти функции может выполнять сетевой процессор.

8. Вычисления. Иногда требуется производить над данными те или иные сложные вычисления, например, выполнять компрессию и декомпрессию, кодирование и декодирование. Эти действия можно переложить на сетевой процессор.

9. Управление заголовками. Иногда приходится добавлять или удалять заголовки, а также менять значения тех или иных полей. Например, в 1Р-заголовке есть счетчик числа хопов, которые пакет еще может пройти перед самоуничтожением. После прохождения каждого хопа значение счетчика необходимо уменьшать на 1, и эту функцию вполне может выполнять сетевой процессор.

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

11. Генерирование контрольных сумм. В исходящих пакетах должны быть контрольные суммы. Контрольная сумма 1Р-пакетов может вычисляться сетевым процессором, в то время как контрольная сумма ЕЛетег^-пакетов в общем случае генерируется аппаратно.

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

13. Сбор статистики. Многие компании хотели бы иметь статистику трафика, и сетевые процессоры могут собирать эти сведения.

Повышение производительности

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

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

Обычно выходом является увеличение числа РРЕ-контроллеров - этот подход особенно эффективен для параллельных архитектур. Может помочь также увеличение длины конвейера, но только в том случае, если удастся разделить процесс обработки пакета на достаточно простые этапы.

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

Можно также повысить скорость, сократив время прохождения пакетов в системе за счет введения дополнительных шин и увеличения количества линий в существующих. Наконец, обычно прироста производительности удается добиться заменой микросхем памяти (SRAM вместо SDRAM), но это, естественно, сказывается на стоимости.

Конечно же, это далеко не все, что можно сказать о сетевых процессорах. За дополнительной информацией обращайтесь к [47, 50, 125, 158].

Сопроцессоры || Оглавление || Мультимедиа-процессоры