Вы абсолютно правы, если мы будем использовать цикл команд на бит, то 10 Гбит / с будет недостижимым. Итак, первое, что нужно отметить, - это то, что мы обрабатываем слово на инструкцию CPU - 64 бита.
Даже в этом случае худшее, что мы можем сделать для производительности, - это иметь доступ к процессору ко всем словам пакета. Таким образом, основное внимание уделяется обработке пакетов с нулевым копированием. Часть этой хитрости заключается в самих интерфейсах: у них есть DMA («Прямой доступ к памяти»), так что чип контроллера Ethernet копирует данные в ОЗУ; они вычисляют контрольные суммы так, чтобы ЦП не должен был обращаться ко всем словам в пакете, чтобы сделать это. Отчасти это связано с дизайном структуры данных: мы стараемся выровнять буферы пакетов, чтобы мы могли перемещать их, изменяя принадлежность записи таблицы страниц. Некоторые из них - просто тщательное программирование, чтобы гарантировать, что к пакетным данным обращаются наименьшее количество раз, и желательно, чтобы они вообще не использовались до получения прикладной программы.
Как только мы сделаем все это, следующее ограничение - это накладные расходы на обработку пакетов по одному. Таким образом, в контроллере Ethernet и в ядре есть куча функций «разгрузки сегментации», что позволяет нам обрабатывать группы пакетов. Мы даже задерживаем получение данных с контроллера Ethernet, чтобы эти группы были больше.
Наконец, у нас есть ярлыки для особых случаев, такие как вызов sendfile () ядра, который представляет собой экспресс-путь от диска к сети с минимальным объемом работы.
Мы даже можем использовать специальную маршрутизацию (пересылку пакетов с одного интерфейса на другой), используя аппаратные функции сетевых интерфейсных карт и рассматривая шину PCI как шину между картами, вместо того, чтобы задействовать процессор. Это невозможно сделать в операционных системах общего назначения, но производители, такие как Intel, предоставляют программные библиотеки для реализации таких функций на своих контроллерах Ethernet.
Отойдя от процессоров в целом, мы можем даже создавать специализированные маршрутизаторы, где все задачи пересылки выполняются аппаратно. Так как шина PCI будет тогда ограничением, они запускают несколько параллельных шин; или даже несколько параллельных шин к множеству параллельных сборок коммутационных ригелей. На одном конце рынка маленький коммутатор Ethernet на основе TCAM будет одним из примеров; на другом конце рынка Juniper M40 был бы каноническим дизайном.
Типичный коммутатор начинает принимать пакет, ищет адрес назначения в TCAM, прикрепляет тег с выходным портом к пакету, а затем отправляет DMA все еще входящий пакет на контроллер выходного порта. Обратите внимание, что если выходной порт перегружен, все, что можно сделать на этом простом коммутаторе, это выбросить входящий пакет. Таким образом, простые переключатели не являются хорошим выбором для случаев, когда ссылки изменяют скорость и желательны некоторые очереди. Конечно, существуют более сложные переключатели, за которые вы платите больше.
Типичный маршрутизатор получит пакет и удержит его в короткой очереди. IP-адрес назначения будет просматриваться в статическом ОЗУ, затем пакет будет разбит на ячейки, чтобы уменьшить задержку, и каждая ячейка будет отправлена на коммутатор с переключателями на выходную карту. Эта карта соберет ячейки в пакет и поставит пакет в очередь из выходного интерфейса. Организация очереди на выходном интерфейсе может быть сложной.
the packet will then be exploded into cells to reduce latency
?