Ви абсолютно правильні, якщо нам доведеться використовувати цикл інструкцій за біт, то 10 Гбіт / с було б недосяжно. Тож перше, що слід зазначити, це те, що ми обробляємо слово за інструкцією CPU - 64 біти.
Навіть тоді найгірше, що ми можемо зробити для продуктивності - це мати доступ до процесора до всіх слів пакету. Таким чином, зосередження уваги на "нульовій копії" обробки пакетів. Деякі з цих хитрощів є в самих інтерфейсах: вони мають DMA ("прямий доступ до пам'яті"), щоб мікросхема контролера Ethernet копіювала дані в оперативну пам'ять; вони обчислюють контрольні суми, щоб CPU не мав доступу до всіх слів у пакеті для цього. Деякі з них є в структурі даних даних: ми обережно вирівнюємо буфери пакетів, щоб ми могли переміщувати їх, змінюючи право власності на запис таблиці сторінок. Деякі з них - це лише ретельне програмування, щоб забезпечити доступ до пакетних даних якнайменше кількість разів, і бажано взагалі не отримувати доступ до отримання додаткової програми.
Після того, як ми все це зробимо, наступне обмеження - це витрати на обробку пакетів один за одним. Таким чином, існує безліч функцій "вивантаження сегментації" як в контролері 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
?