Você está totalmente correto, se tivermos que usar um ciclo de instruções por bit, 10 Gbps seria inatingível. Portanto, a primeira coisa a observar é que lidamos com uma palavra por instrução da CPU - 64 bits.
Mesmo assim, a pior coisa que podemos fazer pelo desempenho é fazer com que a CPU acesse todas as palavras de um pacote. Assim, o foco no manuseio de "cópia zero" de pacotes. Alguns desses truques estão nas próprias interfaces: eles têm DMA ("acesso direto à memória") para que o chip do controlador ethernet copie os dados na RAM; eles calculam as somas de verificação para que a CPU não precise acessar todas as palavras no pacote para fazer isso. Parte disso está no design da estrutura de dados: temos o cuidado de alinhar os buffers de pacotes para que possamos movê-los alterando a propriedade de uma entrada da tabela de páginas. Algumas delas são apenas uma programação cuidadosa para garantir que os dados do pacote sejam acessados pelo menor número de vezes e, de preferência, não sejam acessados até o programa aplicativo de recebimento.
Depois de fazer tudo isso, a próxima limitação é a sobrecarga de manipular pacotes, um de cada vez. Portanto, há um monte de recursos de "descarregamento de segmentação" no controlador ethernet e no kernel, para que possamos lidar com grupos de pacotes. Estamos atrasando a recuperação de dados do controlador ethernet para que esses grupos sejam maiores.
Finalmente, temos atalhos de casos especiais, como a chamada sendfile () do kernel, que é um caminho expresso do disco para a rede usando a quantidade mínima de trabalho.
Podemos até rotear casos especiais (o encaminhamento de pacotes de uma interface para outra) usando os recursos de hardware das placas de interface de rede e tratando o barramento PCI como um barramento entre as placas, em vez de envolver a CPU. Isso não pode ser feito em sistemas operacionais de uso geral, mas fornecedores como a Intel fornecem bibliotecas de software para implementar esses recursos em seus controladores ethernet.
Afastando-se das CPUs, podemos até construir roteadores para fins especiais, onde todas as tarefas de encaminhamento acontecem no hardware. Como o barramento PCI seria uma limitação, eles executam vários barramentos paralelos; ou até vários barramentos paralelos para vários conjuntos de chaves de barras paralelas. Em uma extremidade do mercado, um pequeno switch Ethernet baseado em TCAM seria um exemplo; No outro extremo do mercado, o Juniper M40 seria um projeto canônico.
Um switch típico começará a receber um pacote, procurará o endereço de destino no TCAM, anexará um tag com a porta de saída ao pacote e, em seguida, DMA o pacote ainda recebido ao controlador da porta de saída. Observe que, se a porta de saída estiver congestionada, tudo o que pode ser feito nesse comutador simples é jogar fora o pacote de entrada. Portanto, comutadores simples não são uma boa escolha para quando os links alteram a velocidade e é desejável um certo enfileiramento. É claro que existem switches mais sofisticados, pelos quais você paga mais.
Um roteador típico receberá um pacote e o mantém em uma fila curta. O endereço IP de destino será pesquisado na RAM estática, o pacote será explodido nas células para reduzir a latência e cada célula será enviada para um comutador de barra cruzada no cartão de saída. Esse cartão remontará as células em um pacote e enfileirará o pacote na interface de saída. A fila na interface de saída pode ser sofisticada.
the packet will then be exploded into cells to reduce latency
?